Linq:返回大型数据集的结果计数

本文关键字:结果 数据集 返回 大型 Linq | 更新日期: 2023-09-27 18:14:08

我有IEnumerable,这是数据库查询的结果,有一个大的数据集,多达10000条记录。我需要计数显示在网页上的分页。我怎么能做到这一点,使用.Count()将导致异常,如1底层提供者在开放上失败或花费太长时间。

是否有一种方法,我可以查询数据库以获得linq-sql结果的计数?

Linq:返回大型数据集的结果计数

这可能是您使用LINQ的方式。如果您像这样调用查询:

var users = (from u in context.Users select u);
int userCount = users.Count();

将有效地只调用查询从数据库返回一个计数。如果你做了这样的事情:

List<User> users = (from u in context.Users select u).ToList();
int userCount = users.Count();

将调用并从数据库中检索记录,然后尝试计数。

让数据库告诉您计数—数据库就是为此而构建的—并且当您只想使用一小部分时,只从数据库中选择您需要的行,而不是从数据库中返回全部行。

您可以先执行一个select count查询,但随后可能已经添加或删除了一些数据。把它包装在一个事务中,你就会有一个巨大的锁问题。

另一种方法是获取第1页,然后在另一个线程上批量获取其余部分,当完成更新计数并显示时,您甚至可以有一个运行计数,以指示获取所有数据的进度。

你为什么一次拿到所有的记录?

如果你把它看成是得到第一页,最后一页,上一页和下一页。然后处理由此产生的问题,你就有了一个可扩展的解决方案。

count花费这么长时间的原因是它必须将所有10,000条记录吸入客户端以便对它们进行计数。这是一个很难扩展的解决方案,想象一下10万或100万的规模!另一点是延迟。这10万是在查询执行时,刷新不会流行,对吧。然后当你做刷新时,你有所有的页面显示你在问题…

如果您重新制作它以获得当前显示的最后一个记录之后或第一个记录之前的下n条记录…然后你可以缓存,你可以在后台刷新页面,你可以尝试预测请求,比如提前获取下一个n页