EF分页技术用于获取少量选定数据

时间:2017-10-09 13:26:11

标签: c# entity-framework

我很少使用EF。所以我想知道我们如何分页数据。只需要一个代码

List<customers> _customers = (from a in db.customers select a).ToList();
var _dataToWebPage = _customers.Take(50);

看到上面的两行,它似乎从db获取所有数据,在第二行中它从多个数据中获取50个数据。

上面的代码命中db两次吗? 或EF以这样的方式生成sql,结果它只从db?

获取50条记录

当EF了解它需要命中db才能获取数据?请指导我。感谢

3 个答案:

答案 0 :(得分:1)

linq查询返回IQueryable,可用于制作查询。这里生成的sql只占用50个元素,而不是整个集合。当您在IQueryable上致电var _dataToWebPage = (from a in db.customers select a) .OrderBy(a => a.Id) // It is an unordered collection, so you have to order it .Take(50) .ToList(); 时,查询会点击数据库并收到结果。

这就是你想要的方式:

uv_ipv4_addr

答案 1 :(得分:1)

您的代码的作用:

  • 它将所有选定的数据加载到ToList()的客户端内存中。 ToList发生在客户端内存之后的所有内容,而不是服务器端
  • 它在客户端列表中构造来自Take(50)的延迟可枚举。它会评估您实际迭代_dataToWebPage枚举
  • 的时间

如何实现分页:

确保订购所选数据,否则某些SQL提供商会忽略Skip或提供其他意外结果。然后在Skip(...).Take(...)上应用IQueryable<T>,然后将数据加载到客户端内存中。

分页的示例代码:

int countPerPage = 50;
int currentPage = 1; // zero based index
List<customers> page_customers = db.customers
    // you need to decide how to order your data
    .OrderBy(a => a.Id)
    .Skip(currentPage * countPerPage)
    .Take(countPerPage)
    .ToList();

答案 2 :(得分:0)

在您的代码中,EF命中数据库一次,但是存在从数据库获取所有记录然后切割前50条记录的问题。当您调用ToList()方法时,EF会命中数据库。您需要先调用Take(50),然后再调用ToList()才能从数据库中获取50条记录。