LINQ to Entities 跳过并采取
LINQ to Entities Skip and Take
我正在创建带分页的页面,并获得了采用参数 page
和 numberOfElementsPerPage
的方法。
在此方法中,我使用 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
你是对的,如果以这种方式实施,那将是一个非常糟糕的解决方案。幸运的是,它 不是 以这种方式实现的:来自 Skip
和 Take
的值以特定于 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?
我正在创建带分页的页面,并获得了采用参数 page
和 numberOfElementsPerPage
的方法。
在此方法中,我使用 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
你是对的,如果以这种方式实施,那将是一个非常糟糕的解决方案。幸运的是,它 不是 以这种方式实现的:来自 Skip
和 Take
的值以特定于 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?