使用LINQ to Entity而不将所有行放入内存

时间:2013-09-09 17:00:26

标签: c# linq entity-framework

我使用此方法从EF获取每页数据:

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

我想知道;此代码是否会获取MyObj的所有行并存储在内存中,然后SkipTake或上述所有代码都将转换为SQL命令?< / p>

如果所有第一个都将存储在内存中,我如何使用LINQ to entity来不使用内存SkipTake

4 个答案:

答案 0 :(得分:7)

只要您没有实现查询(即调用ToList() / ToArray()等,或迭代它),您的SkipTake方法就会由Linq to Entities提供程序转换为SQL,该提供程序是Entity Framework的一部分。

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

有关完整说明,请参阅this MSDN article

答案 1 :(得分:3)

SkipTake都列为LINQ to Entities supported methods,因此它们将转换为正确的SQL语句,并且只会从数据库中检索必要的行。

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

答案 2 :(得分:2)

将评估

SkipTake,然后将结果存储到内存中,因此它不会将整个数据集保存在内存中。这称为Deferred Execution

答案 3 :(得分:0)

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