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