LINQ to Entity Skip and Take

CSh*_*ner 5 c# linq orm entity entity-framework

我正在创建带有分页的页面,并获得了采用参数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);
}
Run Code Online (Sandbox Code Playgroud)

我想问的是,这个Skip/如何Take工作?它是否首先从数据库中获取所有记录,然后订购Skip/ Take?如果是的话,我认为如果数据库有 100000 条记录甚至更多,这是非常糟糕的解决方案。那么最好的解决方案是什么?

das*_*ght 2

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

这是最好的解决方案。

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

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

SELECT ...
FROM ...
WHERE ...
...
OFFSET <skip-value> ROWS
FETCH NEXT <take-value> ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)