LINQ to Entities 跳过并采取

LINQ to Entities Skip and Take

我正在创建带分页的页面,并获得了采用参数 pagenumberOfElementsPerPage 的方法。

在此方法中,我使用 Linq to Entities 加载页面元素:

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 条记录或更多记录,这是非常糟糕的解决方案。那么最好的解决方案是什么?

So whats the best solution?

这是最好的解决方案。

If yes I think this is pretty bad solution

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

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

如果它是 Entity Framework DataContext,那么它会生成适当的 SQL,它只检索您需要的记录。您可以使用 SQL 分析器来验证它。

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

How do I view the SQL generated by the entity framework?