如何提高foreach循环的性能

How to increase performance of foreach loop

我正在使用 foreach 循环来计算问题的答案。

它会计算一个问题的所有答案,但是当它加载下一个问题时,每次都需要一分钟。我怎样才能减少这个时间?

List<Questionnaire> myQuestionnaires = report.Project
                                             .Questionnaires
                                             .Where(q => q.Active)
                                             .ToList<Questionnaire>();          

foreach (Questionnaire q in myQuestionnaires)
{
    foreach (ItemAnswer a in q.Answers)
    {
        //possible answers 
    }
}                

我会做的是不使用 .ToList() 或 .AsEnumerable()。这两个函数将执行由您的 linq 语句生成的 T-SQL 并将所有记录拉入内存。

更好的选择是继续使用 linq 通过谓词过滤结果。

var query = report.Project
                  .Questionnaires
                  .Where(q => q.Active && q.Answers == /*some condition*/)

var query = report.Project
                  .Questionnaires
                  .Where(q => q.Active)
                  .Select(q => q.Answers) // Select the answers only
                  .Where(answers => answers.Property == /* some condition */)

然后在完成记录过滤后,在读取时调用 .ToList() 或 .AsEnumerable() 以获取结果。

这使您能够使用数据库来完成所有工作,而不是将集合拉入内存并进行迭代。

看来是延迟加载的问题,因为LINQ默认是开启延迟加载的。在你的代码部分,它将为每个问题从数据库加载所有答案(没有任何连接)。

您可以使用

在数据上下文级别控制延迟加载
    report.DeferredLoadingEnabled=false;

现在您必须编写一些额外的代码行来获取答案,因为现在 "q.Answers" 不会 data.You 可以编写另一个 Linq 来在第一个 foreach 循环中获取答案,并且不会花那么多时间。