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. 将总记录数查询提前,在分页计算时使用,减少查询次数,提升查询性能。
游戏索引列表 API

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

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