游戏索引列表 API
public async Task<ApiResult> IndexList(int g, int p = 1)
{
if (g <= 0 || g > 100) return Api.Error('游戏不存在或未开放');
var gc = await BLLConfig.GetConfigGameByGidAsync(g);
if (gc == null || gc.IsShow == 0) return Api.Error('游戏不存在或未开放');
var page = PageUtil.PageModel(p);
var date = PageUtil.DateDay(-7);
var gameIdList = await _game.SelectListAsync(x => x.Gid == g && x.OpenTime > date, x => x.Datano, false);
if (!gameIdList.Any()) return Api.Error('未找到游戏');
//联表查询
var mybetList = await _db.ZgamesMyBets
.Where(x => x.Gid == g && x.Uid == 10002 && gameIdList.Contains(x.Did))
.Join(gameIdList, m => m.Did, g => g.Id, (m, g) => new GameIndexList
{
Id = g.Id,
Dateno = g.Datano,
OpenTime = g.OpenTime,
StopTime = g.StopTime,
State = g.Status,
BetRs = g.AllBetRs,
WinRs = g.AllWinRs,
AllCoin = g.AllBetTotal,
MyBet = m.BetTotal,
MyWin = m.WinTotal,
Addend = g.Num,
Result = g.OpenNum
})
.ToListAsync();
//未开奖的游戏查询明细
var strtus = mybetList.Where(x => x.State == 0).ToList();
if (strtus.Any())
{
var betTotalDict = await _db.ZgamesBetDetails
.Where(x => x.Gid == g && x.Uid == 10002 && gameIdList.Contains(x.DatanoId))
.GroupBy(x => x.DatanoId)
.ToDictionaryAsync(g => g.Key, g => g.Sum(x => x.BetTotal));
foreach (var item in strtus)
{
if (item.State == 0 && betTotalDict.TryGetValue(item.Id, out var betTotal))
{
item.MyBet = betTotal;
}
}
}
//输出
var totalCount = await _game.CountAsync(x => x.Gid == g && x.OpenTime > date);
PageData<GameIndexList> res = new()
{
PageIndex = page.PageIndex,
PageSize = page.PageSize,
Count = PageUtil.Total(totalCount, page.PageSize),
ListData = mybetList,
};
return Api.Ok(res);
}
优化说明:
1. 使用 SelectListAsync 替换 SelectPageList,只查询所需字段,减少数据传输,提升查询性能;
2. 使用 Contains 代替 GroupJoin,查询所需数据,减少数据传输,提升查询性能;
3. 使用 ToListAsync 替换 ToList,异步执行查询,提升查询性能;
4. 使用 ToDictionaryAsync 将查询结果转换为字典,减少循环查询,提升查询性能;
5. 使用 await/async 异步执行数据库操作,提升查询性能;
6. 将总记录数查询提前,在分页计算时使用,减少查询次数,提升查询性能。
原文地址: https://www.cveoy.top/t/topic/lDhb 著作权归作者所有。请勿转载和采集!