我正在使用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>
}
答案 0 :(得分:1)
EF6 +中的默认行为是在执行时将查询结果读入内存。因此,原则上,您的原始代码和第二遍应具有几乎相同的性能配置文件。
编辑:顺便提一下,如果您想自己证明这一点,请在页面渲染期间运行SQL配置文件会话;你应该只看到一次执行查询。