【问题标题】:Why is IEnumerable.Count() capped at 200?为什么 IEnumerable.Count() 的上限为 200?
【发布时间】:2010-10-01 17:00:16
【问题描述】:

IEnumerable.Count()(或 IQueryable.Count())使用 LINQ to SQL 的行数是否有限制?无论出于何种原因,如果我的查询返回超过 200 条记录,我只能从 IEnumerable.Count() 获得 200 条记录。我什至尝试过使用 IEnumerable.LongCount() (即使结果的数量不应该高到需要它)。我还验证了在数据库上调用 COUNT 会返回超过 200 条记录。

我检查了 MSDN 并尝试用谷歌搜索它,但无济于事。

我是不是疯了,还是我在某处遗漏了什么?我想这没什么大不了的(因为程序正在插入正确数量的记录),但是能够记录传输的记录数量会很好。

我们可以看看一些示例代码吗?

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。我刚刚发现的是,如果我在 narrowed_results (IEnumerable) 上调用 Count,它会返回正确的数量。如果我在结果(IQueryable)上调用它,它只返回 200。我会继续解决 Skeet 的答案(因为他提到了 IQueryable 和 IEnumerable 之间的区别),但是如果有人能够解释为什么会发生这种情况,我'很想听。

【问题讨论】:

  • 将 _dc.Log 分配给某个东西,这样您就可以看到正在生成什么 SQL。 AsEnumerable.Count 将导致查询执行,并且计数将对加载到内存中的结果进行操作。在 IQueryable 上执行它会导致计数被转换到服务器......

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


【解决方案1】:

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

要检查的最明显的事情是正在向数据库发送什么查询。此外,无论您是拨打Enumerable.Count()(即IEnumerable&lt;T&gt;)还是Queryable.Count()(即IQueryable&lt;T&gt;),都非常重要。前者将遍历 .NET 代码中的实际行以检索计数;后者会将计数放入查询中。

我们可以看看一些示例代码吗?

编辑:好的,看到代码:

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

  • 我怀疑您并没有真正调用 OfType。您可以调用 AsEnumerable,或者将 results 声明为 IEnumerable&lt;Irms_tx_modify_profile_ban&gt;。重要的是变量的类型决定了要使用的扩展方法 - 以及执行计数的位置。

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

【讨论】:

  • 好吧,其余的东西在程序的其他地方使用。我确实尝试将结果声明为 IEnumerable,但遇到了同样的问题。我发现的唯一解决方案是添加 OfType 调用或返回 Queryable。我选择前者只是为了避免重构世界。
  • 那很奇怪。我仍然有兴趣看看在损坏的情况下执行了什么 SQL :)
猜你喜欢
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-28
  • 1970-01-01
  • 2014-06-21
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多