为什么IEnumerable.Count()上限为200?

时间:2009-01-15 21:54:37

标签: c# .net sql-server linq-to-sql .net-3.5

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之间的区别),但如果有人能够解释为什么会发生这种情况,我'我喜欢听。

1 个答案:

答案 0 :(得分:3)

我没有听说过这样的事情,听起来很奇怪。

要检查的最明显的事情是将查询发送到数据库。此外,无论您是拨打Enumerable.Count()(即IEnumerable<T>)还是Queryable.Count()(即IQueryable<T>),这都很重要。前者将遍历.NET代码中的实际行以检索计数;后者会将计数放入查询中。

我们能看到一些示例代码吗?

编辑:好的,所以看过代码:

  • 当您没有调用OfType时,它正在SQL级别执行计数。这应该在SQL记录中可见,并且应该可以与任何其他SQL工具重现。

  • 我怀疑你并没有 来调用OfType。您可以调用AsEnumerable,或者只将results声明为IEnumerable<Irms_tx_modify_profile_ban>。重要的是变量的类型决定了要使用的扩展方法 - 因此执行计数的位置。

值得注意的是,您当前的解决方案效率非常低 - 它正在获取所有数据,并对其进行计数,但忽略了除计数之外的所有数据。将计数放到服务器端会好得多 - 虽然我知道目前不起作用,但我确信通过一些分析我们可以使它工作:)