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

时间:2011-11-11 20:20:52

标签: c# linq entity-framework linq-to-sql

我有IEnumerable,它是具有大型数据集的数据库查询的结果,多达10000条记录。我需要计数才能在网页上显示分页。我怎么能这样做,使用.Count()将导致例外情况,例如1,底层提供程序在Open`上失败或占用太长时间。

有没有办法可以查询数据库来获取linq-sql的结果计数?

3 个答案:

答案 0 :(得分:3)

您可能正在使用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();

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

答案 1 :(得分:2)

让数据库告诉您计数 - 构建数据库是为了能够执行此操作 - 并且只选择数据库中所需的行,而不是在您只想使用小子集时从数据库返回整个集合。

答案 2 :(得分:0)

您可以先执行选择计数查询,但可能已添加或删除了某些数据。将它包装在一个事务中,你将遇到一个巨大的锁定问题。

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

为什么一次收到所有记录?

如果您将其视为第一页,最后一页,上一页和下一页。 然后处理由该方法产生的问题,您将拥有可扩展的解决方案。

计数耗时很长的原因是它必须将所有10,000条记录吸入客户端才能计算它们。 这是一个非常糟糕的解决方案,想象一个10万或10万! 另一点是延迟。那些100,000是在执行查询时,刷新不会受欢迎。然后当你刷新时,你所有的页面都显示你所遇到的问题...

如果你重新编写它以获得当前显示的最后一个或第一个之前的下n个记录...... 然后你可以缓存,你可以在后台刷新页面,你可以尝试预测请求,比如事先得到下n页。