【发布时间】:2014-05-04 22:22:23
【问题描述】:
我被要求加快一个非常长的查询的性能(这里只列出了其中的一部分,但它会给出正在发生的事情的一般概念)。我相信每个陈述的数量(大约 10 个)都会导致这种情况永远持续下去。这会导致浏览器消息“脚本耗时过长”。即使不是这种情况,也需要很长时间才能运行。
我的问题是这样的。难道没有更好的方法吗????
这里是代码。
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
});
}
....
【问题讨论】:
-
你真的同时使用
linq-to-sql、linq-to-entities和linq-to-objects吗? -
看起来像那样。我不得不解开这段代码。但是,是的,以上都有。
-
如果你有足够的内存,可以在本地缓存远程数据,以节省网络时间。
-
您可能需要发布更多代码。由此看来,q 仅用于从问题中获取 Id,这可以通过 select 而不是 groupby 来完成。然后你也可以结合查询
-
获取分析器以查看实际执行的 SQL。可能有 N+1 个问题。如果是这样,请阅读 L2S 的 LoadWidth。
标签: linq linq-to-sql linq-to-entities linq-to-objects