C#entity framework分页

有没有办法获得复杂的Linq查询和数百万条记录的行数, 而无需点击数据库两次或写入2个单独的查询?

我可能有自己的建议。 写一个存储过程,但我很擅长MySQL而不是MSSQL。

任何更好的建议都会很棒。 此外,如果有人知道Microsoft是否正在将此function添加到entity framework中。

我建议使用Take()函数。 这可用于指定从linq查询或List中获取的记录数。 例如

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

我在MVC应用程序中使用类似的技术,我将_customers列表写入会话,然后在用户单击第2,3页等时使用此列表进行进一步的分页查询。这样可以节省多个数据库命中。 但是,如果你的列表非常大,那么写它也可能不是一个好主意。

对于分页,您可以一起使用Skip()和Take()函数。 例如,获取数据的第2页:

 var _dataToWebPage = _customers.Skip(50).Take(50); 

显示数百万条记录的常用方法就是不显示所有页面。 想一想:如果你有数百万条记录,比如每页20个甚至100个项目,那么你将有数万页。 展示它们是没有意义的。 您只需加载当前页面并提供指向下一页的链接即可。 或者您可以加载说100-500条记录,但仍然只显示一个页面并使用加载的记录信息生成前几页的页面链接(因此确切知道有多少下一页可用)。

在sql server上这么容易。 你可以写这个查询:

 select count() over(), table.* from table 

count()over()将返回结果中的总行数,因此您不需要运行两个查询。请记住,您应该在您的上下文中运行原始sql或使用返回结果作为视图模型的dapper