IEnumerable.Count()(或IQueryable.Count())使用LINQ to SQL的行是否有限制?无论出于何种原因,如果我的查询返回超过200条记录,我只能从IEnumerable.Count()中获得200条记录。我甚至尝试过使用IEnumerable.LongCount()(即使结果数量不够高,也不需要它)。我还验证了在数据库上调用COUNT会返回超过200条记录。
我已经检查过MSDN并尝试使用Google搜索,但无济于事。
我是疯了,还是有什么我在某处遗失的?我想这不是一个大问题(因为程序正在插入正确数量的记录),但能够记录传输的记录数量会很好。
我们能看到一些示例代码吗?
public IEnumerable<Irms_tx_modify_profile_ban> ExtractNewAdmits()
{
var results = from a in _dc.Applications
select (Irms_tx_modify_profile_ban)new RMSProfile
{
//assign column names to property names
};
//Don't know why, but Bad Things happen if you don't put the
//OfType call here.
IEnumerable<Irms_tx_modify_profile_ban> narrowed_results = results.OfType<Irms_tx_modify_profile_ban>();
Program.log.InfoFormat("Read {0} records from Banner.", narrowed_results.Count());
return narrowed_results;
}
关于发生不良事件的评论的原因是the issues brought up in this thread。我刚刚发现的是,如果我在Nared_results(IEnumerable)上调用Count,它会返回正确的数量。如果我在结果(IQueryable)上调用它,它只返回200.我将继续解决Skeet的答案(因为他提到了IQueryable和IEnumerable之间的区别),但如果有人能够解释为什么会发生这种情况,我'我喜欢听。
答案 0 :(得分:3)
我没有听说过这样的事情,听起来很奇怪。
要检查的最明显的事情是将查询发送到数据库。此外,无论您是拨打Enumerable.Count()
(即IEnumerable<T>
)还是Queryable.Count()
(即IQueryable<T>
),这都很重要。前者将遍历.NET代码中的实际行以检索计数;后者会将计数放入查询中。
我们能看到一些示例代码吗?
编辑:好的,所以看过代码:当您没有调用OfType时,它正在SQL级别执行计数。这应该在SQL记录中可见,并且应该可以与任何其他SQL工具重现。
我怀疑你并没有 来调用OfType。您可以调用AsEnumerable,或者只将results
声明为IEnumerable<Irms_tx_modify_profile_ban>
。重要的是变量的类型决定了要使用的扩展方法 - 因此执行计数的位置。
值得注意的是,您当前的解决方案效率非常低 - 它正在获取所有数据,并对其进行计数,但忽略了除计数之外的所有数据。将计数放到服务器端会好得多 - 虽然我知道目前不起作用,但我确信通过一些分析我们可以使它工作:)