我使用此方法从EF获取每页数据:
public IEnumerable<MyObj> GetByPage(int page, int perPage)
{
return context.MyObj.Skip((page - 1) * perPage).Take(perPage);
}
我想知道;此代码是否会获取MyObj
的所有行并存储在内存中,然后Skip
和Take
或上述所有代码都将转换为SQL命令?< / p>
如果所有第一个都将存储在内存中,我如何使用LINQ to entity来不使用内存Skip
和Take
?
答案 0 :(得分:7)
只要您没有实现查询(即调用ToList()
/ ToArray()
等,或迭代它),您的Skip
和Take
方法就会由Linq to Entities提供程序转换为SQL,该提供程序是Entity Framework的一部分。
所以回答你的问题:不,它不会获取所有数据并将其加载到内存中。
有关完整说明,请参阅this MSDN article。
答案 1 :(得分:3)
Skip
和Take
都列为LINQ to Entities supported methods,因此它们将转换为正确的SQL语句,并且只会从数据库中检索必要的行。
因为您的方法返回IEnumerable<T>
而不是IQueryable<T>
,每次调用从该方法返回的查询都将导致查询执行。
答案 2 :(得分:2)
Skip
和Take
,然后将结果存储到内存中,因此它不会将整个数据集保存在内存中。这称为Deferred Execution。
答案 3 :(得分:0)
最终它取决于您的数据存储,但对于SQL Server,它不会提取该查询中未定义的任何记录。对于T-SQL,TOP谓词用于“跳过”记录。