在IQueryable中多次执行ToList

时间:2017-03-28 01:06:37

标签: c# .net sql-server entity-framework

我正在尝试微调一些EF代码。我可以看到,一个Iqueryable被多次转换为列表。这是否意味着,EF将执行查询多次调用tolist(或)它将只执行一次查询,并将为其余的tolist调用返回相同的结果。

2 个答案:

答案 0 :(得分:1)

  

EF将执行查询多次调用tolist

这是事实。顺便说一下调查EF查询以及调用数据库的时间 - 只需使用SQL server Profiler。这是最好的方法

答案 1 :(得分:1)

IQueryable<>每次调用ToList时都会评估,所以如果你有一个IQueryable<>在一个循环中,这将是一个问题。例如:

var first = context.Something;

foreach(var element in first)
{
  var second = context.SomethingElse;
 //do something with second
}

//do something with first again

秒将至少评估第一个长度时间,并且首先评估至少两次。因此,您最好在循环外移动第二个,并使用ToList强制进行评估,并确保IQueryable<>将只评估一次,如下所示:

var first = context.Something.ToList();
var second = context.SomethingElse.ToList();

foreach(var element in first)
{
 //do something with second
 //second will not be evaluated each iteration
}

//do something with first again