LINQ to Entities Skip 和 Take

5

我正在创建带有分页的页面,并使用带有参数 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 条或更多记录时,这将是相当糟糕的解决方案。那么什么是最好的解决方案呢?


不,EF查询提供程序将把它翻译成SQL,并且分页将由数据库执行。这是最好的解决方案。 - Charles Mager
3个回答

2

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

这是最佳解决方案。

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

你说得对,如果以那种方式实现,它将是一个相当糟糕的解决方案。幸运的是,它并不是以那种方式实现的:从 SkipTake 中获取的值以特定于 SQL 方言的方式传递到 RDBMS 服务器,此时数据库会决定如何查找和提供记录。在 SQL Server 的情况下,使用类似于以下语法:

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

0
如果使用实体框架(Entity Framework)的 DataContext,它会生成适当的 SQL 语句,仅检索您需要的记录。您可以使用 SQL 分析器进行验证。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接