Foreach 命令中的 LINQ/EF 查询会被执行多次吗?
Does this LINQ/EF Query in the Foreach command get executed multiple times?
我正在使用 MVC3、.NET4.5、EF6.1,SQL Server 2008 SP2。
在我看来,我有如下一行,它构建了一个 table:
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 查询只查询数据库一次,然后 Foreach 命令循环访问内存集合。从我的追踪来看,似乎这个 foreach 步骤花费的时间比预期的要长,每次迭代大约 250 毫秒。
我认为每次迭代查询都可能访问数据库是否正确?如果是这样,那么我可以强制一次性点击数据库吗?我认为我在 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>
}
EF6+ 中的默认行为是在执行时将查询结果读入内存。因此,原则上,您的原始代码和您的第二遍代码应该具有几乎相同的性能配置文件。
编辑:顺便说一下,如果您想向自己证明这一点,请在页面呈现期间 运行 SQL 配置文件会话;您应该只看到一次查询执行。
我正在使用 MVC3、.NET4.5、EF6.1,SQL Server 2008 SP2。
在我看来,我有如下一行,它构建了一个 table:
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 查询只查询数据库一次,然后 Foreach 命令循环访问内存集合。从我的追踪来看,似乎这个 foreach 步骤花费的时间比预期的要长,每次迭代大约 250 毫秒。
我认为每次迭代查询都可能访问数据库是否正确?如果是这样,那么我可以强制一次性点击数据库吗?我认为我在 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>
}
EF6+ 中的默认行为是在执行时将查询结果读入内存。因此,原则上,您的原始代码和您的第二遍代码应该具有几乎相同的性能配置文件。
编辑:顺便说一下,如果您想向自己证明这一点,请在页面呈现期间 运行 SQL 配置文件会话;您应该只看到一次查询执行。