使用ForEach从Linq到SQL的速度很慢

使用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(

我被要求加快一个非常长的查询的性能(这里只列出了其中的一部分,但它将给出正在发生的事情的总体想法)。我相信,无数的for-each语句(大约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
        });
    }
....
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中通常效率很低,因为它的工作方式不同于sql
GroupBy
命令

最终得到的是一个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。