使用 C# Entity Framework 优化联表查询和未开奖游戏明细查询

以下代码展示了如何使用 C# Entity Framework 优化联表查询和未开奖游戏明细查询:

var mybetList = await _db.Zgames
                .Include(x => x.MyBets)
                .Where(x => x.Gid == g && x.OpenTime > date)
                .OrderByDescending(x => x.Datano)
                .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.MyBets.Where(xx => xx.Uid == 10002).Sum(xx => xx.BetTotal),
                    MyWin = x.MyBets.Where(xx => xx.Uid == 10002).Sum(xx => xx.WinTotal),
                    Addend = x.Num,
                    Result = x.OpenNum
                })
                .ToListAsync();

if (mybetList.Any(x => x.State == 0))
{
    var betDetails = await _db.ZgamesBetDetails
                            .AsNoTracking()
                            .Where(x => x.Gid == g && x.Uid == 10002)
                            .ToListAsync();

    foreach (var item in mybetList)
    {
        if (item.State == 0)
        {
            item.MyBet = betDetails
                            .Where(x => x.DatanoId == item.Id)
                            .Sum(x => x.BetTotal);
        }
    }
}

优化建议

  1. 将联表查询和未开奖游戏查询明细的代码合并,避免重复查询数据库。
  2. 使用 Include 方法预加载关联表,避免多次查询数据库。
  3. 使用 AsNoTracking 方法禁用跟踪查询,提高查询性能。

优化代码

优化后的代码如下:

var mybetList = await _db.Zgames
                .Include(x => x.MyBets)
                .Where(x => x.Gid == g && x.OpenTime > date)
                .OrderByDescending(x => x.Datano)
                .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.MyBets.Where(xx => xx.Uid == 10002).Sum(xx => xx.BetTotal),
                    MyWin = x.MyBets.Where(xx => xx.Uid == 10002).Sum(xx => xx.WinTotal),
                    Addend = x.Num,
                    Result = x.OpenNum
                })
                .ToListAsync();

if (mybetList.Any(x => x.State == 0))
{
    var betDetails = await _db.ZgamesBetDetails
                            .AsNoTracking()
                            .Where(x => x.Gid == g && x.Uid == 10002)
                            .ToListAsync();

    foreach (var item in mybetList)
    {
        if (item.State == 0)
        {
            item.MyBet = betDetails
                            .Where(x => x.DatanoId == item.Id)
                            .Sum(x => x.BetTotal);
        }
    }
}

解释

  • Include 方法: 使用 Include 方法预加载关联表 MyBets,避免在后续查询中重复查询数据库。
  • AsNoTracking 方法: 使用 AsNoTracking 方法禁用跟踪查询,提高查询性能。
  • 合并查询: 将联表查询和未开奖游戏查询明细合并到一个查询中,避免重复查询数据库。

注意

  • 以上代码示例使用了 await 关键字,因此需要在异步方法中使用。
  • 实际代码可能需要根据具体情况进行调整。

总结

通过使用 Include 方法和 AsNoTracking 方法,以及合并查询,可以有效地优化 C# Entity Framework 中的联表查询和未开奖游戏明细查询,提高程序性能。

C# Entity Framework: 优化联表查询和未开奖游戏明细查询

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

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