我使用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
}
}
答案 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循环的答案,并且它不会花费那么多时间。