如何提高foreach循环的性能

时间:2015-05-14 12:32:46

标签: c# asp.net-mvc-3 loops foreach

我使用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 
    }
}                

2 个答案:

答案 0 :(得分:2)

我要做的是不使用.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()来获取结果。

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

答案 1 :(得分:1)

似乎是延迟加载的问题,因为默认情况下LINQ具有延迟加载启用。在你的代码部分,它将从db为每个问题加载所有Answers(没有任何连接)。

您可以使用

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

现在你必须写一些额外的代码来获得答案,因为现在&#34; q.Answers&#34;将不会有数据。你可以写另一个Linq来获得第一个foreach循环的答案,并且它不会花费那么多时间。