LINQ to Entities Skip and Take

本文关键字:and Take Skip Entities to LINQ | 更新日期: 2023-09-27 18:00:16

我正在创建带有分页的页面,并得到了接受参数pagenumberOfElementsPerPage的方法。

在这个方法中,我使用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条记录,甚至更多。那么最好的解决方案是什么呢?

LINQ to Entities Skip and Take

那么最好的解决方案是什么呢?

这是最好的解决方案。

如果是的话,我认为这是一个相当糟糕的解决方案

你是对的,如果以这种方式实现,那将是一个非常糟糕的解决方案。幸运的是,不是以这种方式实现的:SkipTake的值以特定于SQL方言的方式传递到RDBMS服务器,此时数据库决定如何查找记录并为您提供服务。在SQL Server的情况下,使用与以下语法类似的语法:

SELECT ...
FROM ...
WHERE ...
...
OFFSET <skip-value> ROWS
FETCH NEXT <take-value> ROWS ONLY;

如果它是实体框架DataContext,那么它会生成适当的SQL,只检索您需要的记录。您可以使用SQL探查器进行验证。

我同意所有答案,我只想补充一点,您实际上可以看到生成的SQL查询以进行确认。请查看此帖子

如何查看实体框架生成的SQL?