LINQ to Entities Skip and Take
本文关键字:and Take Skip Entities to LINQ | 更新日期: 2023-09-27 18:00:16
我正在创建带有分页的页面,并得到了接受参数page
和numberOfElementsPerPage
的方法。
在这个方法中,我使用Linq到实体为页面加载元素:
public List<Item> GetElements(int page, int numberOfElementsPerPage)
{
return DataContext.Items.OrderBy(x => x.Id).Skip((page-1)*numberOfElementsPerPage).Take(numberOfElementsPerPage);
}
我想问的是,这个Skip
/Take
是如何工作的?它是否首先从数据库中获取所有记录,然后订购Skip
/Take
?如果是的话,我认为这是一个非常糟糕的解决方案,例如,如果数据库有100000条记录,甚至更多。那么最好的解决方案是什么呢?
那么最好的解决方案是什么呢?
这是最好的解决方案。
如果是的话,我认为这是一个相当糟糕的解决方案
你是对的,如果以这种方式实现,那将是一个非常糟糕的解决方案。幸运的是,不是以这种方式实现的:Skip
和Take
的值以特定于SQL方言的方式传递到RDBMS服务器,此时数据库决定如何查找记录并为您提供服务。在SQL Server的情况下,使用与以下语法类似的语法:
SELECT ...
FROM ...
WHERE ...
...
OFFSET <skip-value> ROWS
FETCH NEXT <take-value> ROWS ONLY;
如果它是实体框架DataContext,那么它会生成适当的SQL,只检索您需要的记录。您可以使用SQL探查器进行验证。
我同意所有答案,我只想补充一点,您实际上可以看到生成的SQL查询以进行确认。请查看此帖子
如何查看实体框架生成的SQL?