游戏索引列表 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);
// 使用 Include 方法加载关联实体
var list = await _game.SelectPageList(
page,
x => x.Gid == g && x.OpenTime > date,
x => x.Datano,
false,
"ZgamesBetDetails"
);
// 使用异步 LINQ 执行联表查询
var mybetList = list.ListData
.Select(x => new GameIndexList
{
Id = x.Id,
Dateno = x.Datano,
OpenTime = x.OpenTime,
StopTime = x.StopTime,
State = x.Status,
BetRs = x.AllBetRs,
WinRs = x.AllWinRs,
AllCoin = x.AllBetTotal,
MyBet = x.ZgamesBetDetails.Where(xx => xx.Uid == 10002).Sum(xx => xx.BetTotal),
MyWin = x.ZgamesBetDetails.Where(xx => xx.Uid == 10002).Sum(xx => xx.WinTotal),
Addend = x.Num,
Result = x.OpenNum
})
.ToList();
// 避免多次查询同一实体
var strtus = mybetList.Where(x => x.State == 0).ToList();
if (strtus.Any())
{
var betDetails = _db.ZgamesBetDetails.AsNoTracking()
.Where(x => x.Uid == 10002 && x.Gid == g)
.ToList();
foreach (var item in strtus)
{
if (item.State == 0)
{
item.MyBet = betDetails
.Where(x => x.DatanoId == item.Id)
.Sum(x => x.BetTotal);
}
}
}
// 输出
PageData<GameIndexList> res = new()
{
PageIndex = page.PageIndex,
PageSize = page.PageSize,
Count = PageUtil.Total(list.Count, page.PageSize),
ListData = mybetList,
};
return Api.Ok(res);
}
代码优化说明:
- 使用
Include方法加载关联实体,避免在查询每个游戏详情时都执行一次数据库查询。 - 使用异步 LINQ 的
Select方法执行联表查询,提高查询效率。 - 避免多次查询同一实体,将查询结果缓存到内存中,然后在查询明细时直接从缓存中获取。
代码使用说明:
g参数表示游戏 ID。p参数表示页码,默认值为 1。
返回值:
- 成功返回
ApiResult对象,包含游戏索引列表数据。 - 失败返回
ApiResult对象,包含错误信息。
原文地址: https://www.cveoy.top/t/topic/lDgN 著作权归作者所有。请勿转载和采集!