Foreach命令中的这个LINQ / EF查询是否多次执行?

时间:2015-01-17 01:30:42

标签: entity-framework entity-framework-4 linq-to-entities entity-framework-5 entity-framework-6

我正在使用MVC3,.NET4.5,EF6.1,SQL Server 2008 SP2。

在我看来,我有一条如下所示的行,它构建了一个表:

foreach (var item in Model.myOrder.OrderBy(r =>r.Supplier.CompanyType.SortOrder).ThenBy(r => r.SortOrder).ThenBy(r => r.Date).ThenBy(r => r.Id).ToList())
{
 <tr>
    <td>@item.Id</td>
    <td>@item.Supplier.Name</td>
    <td>@item.Date</td>
 </tr>
 }

显然,我希望LINQ查询只查询一次DB,然后使用Foreach命令迭代内存集合。从我的追踪来看,似乎这个foreach步骤似乎需要比预期更长的时间,每次迭代大约250ms。

我是否认为查询可能每次迭代都会访问数据库?如果是这样,那么我可以强制一次击中数据库。我认为我在Foreach语句中使用.tolist()会导致急切的负载。

感谢。

修改

我不确定我的怀疑是否正确,因为我刚刚修改了我的代码:

    var myItems = Model.myOrder.OrderBy(r =>r.Supplier.CompanyType.SortOrder).ThenBy(r => r.SortOrder).ThenBy(r => r.Date).ThenBy(r => r.Id).ToList();
    foreach (var item in myItems )
{
 <tr>
    <td>@item.Id</td>
    <td>@item.Supplier.Name</td>
    <td>@item.Date</td>
 </tr>
 }

1 个答案:

答案 0 :(得分:1)

EF6 +中的默认行为是在执行时将查询结果读入内存。因此,原则上,您的原始代码和第二遍应具有几乎相同的性能配置文件。

请参阅this CodePlex article

编辑:顺便提一下,如果您想自己证明这一点,请在页面渲染期间运行SQL配置文件会话;你应该只看到一次执行查询。