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

this CodePlex article

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