我很少使用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才能获取数据?请指导我。感谢
答案 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条记录。