[英]Linq Select with Or Statement VS Separate Queries
我有30个表,我想扫描所有表中的所有数据,但是在使用Entity Framework的MVC项目中遇到超时错误。 您可以想象像这样的代码对字母中每个字母的扫描数据;
foreach (var item in db.A_Player.Where(i=>i.CurrentTeamId == teamIdEv || i.CurrentTeamId == teamIdDep))
{
PlayerEntity player = new PlayerEntity()
{
Name = item.Name,
Surname = item.Surname,
Id = item.Id,
CurrentTeamId = item.CurrentTeamId
};
if (item.CurrentTeamId == teamIdEv)
{
playerListEv.Add(player);
}
else
{
playerListDep.Add(player);
}
}
foreach (var item in db.B_Player.Where(i => i.CurrentTeamId == teamIdEv || i.CurrentTeamId == teamIdDep))
{
PlayerEntity player = new PlayerEntity()
{
Name = item.Name,
Surname = item.Surname,
Id = item.Id,
CurrentTeamId = item.CurrentTeamId
};
if (item.CurrentTeamId == teamIdEv)
{
playerListEv.Add(player);
}
else
{
playerListDep.Add(player);
}
}
解决以下问题的问题,我可以使用下面的代码这样的单独查询还是相同? 这些都给速度一样的结果? 如何解决超时错误?
foreach (var item in db.B_Player.Where(i => i.CurrentTeamId == teamIdEv))
{
PlayerEntity player = new PlayerEntity()
{
Name = item.Name,
Surname = item.Surname,
Id = item.Id,
CurrentTeamId = item.CurrentTeamId
};
if (item.CurrentTeamId == teamIdEv)
{
playerListEv.Add(player);
}
else
{
playerListDep.Add(player);
}
}
foreach (var item in db.B_Player.Where(i => i.CurrentTeamId == teamIdDep))
{
PlayerEntity player = new PlayerEntity()
{
Name = item.Name,
Surname = item.Surname,
Id = item.Id,
CurrentTeamId = item.CurrentTeamId
};
if (item.CurrentTeamId == teamIdEv)
{
playerListEv.Add(player);
}
else
{
playerListDep.Add(player);
}
}
您的db.B_Player
是DbSet
的PlayerEntities
吗?
如果是这样,则不需要foreach。 您可以这样做:
这只是伪代码,我现在没有IDE。
playerListEv.AddRange(db.B_Player.Where(i => i.CurrentTeamId == teamIdEv).ToList());
playerListDep.AddRange(db.B_Player.Where(i => i.CurrentTeamId == teamIdDep).ToList());
首先,投影可以最大限度地减少从表中撤回的列(如果您有很多列),从而在各个方面都可以提供帮助。
其次,您可以代替2个较小的查询
var evs = db.B_Player.Where(i => i.CurrentTeamId == teamIdEv)
.Select(x => new PlayerEntity // projection
{
Name = item.Name,
Surname = item.Surname,
Id = item.Id,
CurrentTeamId = item.CurrentTeamId
}).ToList();
var deps= db.B_Player.Where(i => i.CurrentTeamId != teamIdEv)
.Select(x => new PlayerEntity // projection
{
Name = item.Name,
Surname = item.Surname,
Id = item.Id,
CurrentTeamId = item.CurrentTeamId
}).ToList();
或者,您可以投影所有播放器并将其过滤到内存中,
但是,您需要努力解决这里的瓶颈。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.