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);

}

代码优化说明:

  1. 使用 Include 方法加载关联实体,避免在查询每个游戏详情时都执行一次数据库查询。
  2. 使用异步 LINQ 的 Select 方法执行联表查询,提高查询效率。
  3. 避免多次查询同一实体,将查询结果缓存到内存中,然后在查询明细时直接从缓存中获取。

代码使用说明:

  • g 参数表示游戏 ID。
  • p 参数表示页码,默认值为 1。

返回值:

  • 成功返回 ApiResult 对象,包含游戏索引列表数据。
  • 失败返回 ApiResult 对象,包含错误信息。
游戏索引列表 API

原文地址: https://www.cveoy.top/t/topic/lDgN 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录