如何提高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 循环中获取答案,并且不会花那么多时间。
我正在使用 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 循环中获取答案,并且不会花那么多时间。