使用ForEach从Linq到SQL的速度很慢
我被要求加快一个非常长的查询的性能(这里只列出了其中的一部分,但它将给出正在发生的事情的总体想法)。我相信,无数的for-each语句(大约10个)导致了这种情况永远拖延下去。这会导致浏览器消息“脚本占用的时间太长”。即使不是这样,运行也需要很长时间 我的问题是。难道没有更好的办法吗 这是代码使用ForEach从Linq到SQL的速度很慢,linq,linq-to-sql,linq-to-entities,linq-to-objects,Linq,Linq To Sql,Linq To Entities,Linq To Objects,我被要求加快一个非常长的查询的性能(这里只列出了其中的一部分,但它将给出正在发生的事情的总体想法)。我相信,无数的for-each语句(大约10个)导致了这种情况永远拖延下去。这会导致浏览器消息“脚本占用的时间太长”。即使不是这样,运行也需要很长时间 我的问题是。难道没有更好的办法吗 这是代码 var query = questions .Where(x => !x.IsExcluded) .OrderBy(x => x.PrimaryOrder) .ThenBy(
var query = questions
.Where(x => !x.IsExcluded)
.OrderBy(x => x.PrimaryOrder)
.ThenBy(x => x.SecondaryOrder)
.GroupBy(x => x.Id);
foreach (var q in query)
{
var edits = new List<QuestionEdit>();
var answers = new List<ResponseEntity>();
foreach (var r in responses.
Where(x => x.OpportunityContactInterviewQuestionId == q.First().Id))
{
answers.Add(new ResponseEntity()
{
PrimaryAnswerValue = r.PrimaryAnswerValue,
PrimaryAnswerText = r.PrimaryAnswerText,
SecondaryAnswerValue = r.SecondaryAnswerValue,
SecondaryAnswerText = r.SecondaryAnswerText,
IsOther = r.IsOther,
OtherValue = r.OtherValue,
LoopInstance = r.LoopInstance,
LoopText = r.LoopText,
IsSelected = r.IsSelected,
LowValue = r.LowValue,
HighValue = r.HighValue
});
}
....
var query=问题
.其中(x=>!x.i除外)
.OrderBy(x=>x.PrimaryOrder)
.ThenBy(x=>x.SecondaryOrder)
.GroupBy(x=>x.Id);
foreach(查询中的var q)
{
var edits=新列表();
var answers=新列表();
foreach(var)在响应中。
其中(x=>x.OpportunityContactInterviewQuestionId==q.First().Id))
{
答案。添加(新的响应()
{
PrimaryAnswerValue=r.PrimaryAnswerValue,
PrimaryAnswerText=r.PrimaryAnswerText,
SecondaryAnswerValue=r.SecondaryAnswerValue,
SecondaryAnswerText=r.SecondaryAnswerText,
等温线,
OtherValue=r.OtherValue,
LoopInstance=r.LoopInstance,
LoopText=r.LoopText,
IsSelected=r.IsSelected,
LowValue=r.LowValue,
HighValue=r.HighValue
});
}
....
我想让您注意.GroupBy(x=>x.Id);
GroupBy在LinqTo中通常效率很低,因为它的工作方式不同于sqlGroupBy
命令
最终得到的是一个iGroup,根据访问该iGroup的方式,您通常会触发一个新的SELECT以获取iGroup中的所有行
在您的示例中,您仅使用iGroup的键(Id),我确信您在省略的代码中使用了更多信息。但是,如果您仅使用iGroup的键,则有其他方法可以获取该数据。可以选择Id,然后使用Distinct(不带GroupBy)或使用GroupBy,然后使用。选择(v=>v.Key)
此外,您“需要”在适当的时间通过使用例如.ToList()
或.ToArray()
来控制何时实现查询。如果不这样做,可能会导致同一查询多次执行
正如Pleun在评论中所说的,使用一个分析器。或者下载LINQPad并在那里玩你的查询。LINQPad是一个非常宝贵的工具(如果你不需要自动完成,它是免费的).您真的同时使用
linq to sql
、linq to entities
和linq to objects
吗?看起来是这样的。我必须解开此代码。但是,是的,上面都有。如果您有足够的内存,请在本地缓存远程数据以节省网络时间。您可能需要发布更多代码。From这看起来q只用于从问题中获取ID,这可以通过select而不是groupby来完成。然后,您还可以组合查询获取探查器,以查看实际执行的SQL。可能存在N+1问题。如果是,请阅读L2S的LoadWidth。