C# Entity Framework: 优化联表查询和未开奖游戏明细查询
使用 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);
}
}
}
优化建议
- 将联表查询和未开奖游戏查询明细的代码合并,避免重复查询数据库。
- 使用 Include 方法预加载关联表,避免多次查询数据库。
- 使用 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 中的联表查询和未开奖游戏明细查询,提高程序性能。
原文地址: https://www.cveoy.top/t/topic/lDgV 著作权归作者所有。请勿转载和采集!