3

我使用这种方法从 EF 获取每一页数据:

public IEnumerable<MyObj> GetByPage(int page, int perPage)
{
    return context.MyObj.Skip((page - 1) * perPage).Take(perPage);
}

我想知道;这段代码是否会获取所有行MyObj并存储在内存中,然后以上代码将或全部转换为 SQL 命令SkipTake

Skip如果所有首先将存储在内存中,我如何使用 LINQ to entity 不使用内存Take

4

4 回答 4

7

只要您没有具体化查询(即调用ToList()/ToArray()等或对其进行迭代),您的SkipandTake方法就会被作为实体框架一部分的 Linq to Entities 提供程序转换为 SQL。

所以回答你的问题:不,它不会获取所有数据并将其加载到内存中。

有关完整说明,请参阅此 MSDN 文章

于 2013-09-09T17:02:33.517 回答
3

两者SkipTake都被列为支持 LINQ to Entities 的方法,因此它们将被转换为适当的 SQL 语句,并且只会从数据库中检索必要的行。

并且因为您的方法返回IEnumerable<T>而不是对该方法返回IQueryable<T>的查询的每次调用都会导致查询执行。

于 2013-09-09T17:02:36.660 回答
2

Skip并将Take被评估,然后将结果存储到内存中,因此它不会将整个数据集保存在内存中。这称为延迟执行

于 2013-09-09T17:03:16.663 回答
0

最终它取决于您的数据存储,但对于 SQL Server,它不会提取该查询中未定义的任何记录。在 T-SQL 的情况下,TOP 谓词用于“跳过”记录。

于 2013-09-09T17:05:06.327 回答