C# 为什么IEnumerable.Count()的上限是200?

C# 为什么IEnumerable.Count()的上限是200?,c#,.net,sql-server,linq-to-sql,.net-3.5,C#,.net,Sql Server,Linq To Sql,.net 3.5,使用LINQ to SQL对IEnumerable.Count()或IQueryable.Count()的行有限制吗?无论出于何种原因,如果我的查询返回的记录超过200条,那么我只能从IEnumerable.Count()中得到200条。我甚至尝试过使用IEnumerable.LongCount()(即使结果的数量不足以满足需要)。我还验证了在数据库上调用COUNT会返回200多条记录 我已经检查了MSDN并尝试用谷歌搜索,但没有用 是我疯了,还是我在什么地方错过了什么?我想这并不是什么大问题(

使用LINQ to SQL对IEnumerable.Count()或IQueryable.Count()的行有限制吗?无论出于何种原因,如果我的查询返回的记录超过200条,那么我只能从IEnumerable.Count()中得到200条。我甚至尝试过使用IEnumerable.LongCount()(即使结果的数量不足以满足需要)。我还验证了在数据库上调用COUNT会返回200多条记录

我已经检查了MSDN并尝试用谷歌搜索,但没有用

是我疯了,还是我在什么地方错过了什么?我想这并不是什么大问题(因为程序插入了正确数量的记录),但如果能够记录传输的记录数量就好了

我们能看一些示例代码吗

public IEnumerable extractNewAllows()
{
var结果=来自一个in_dc应用程序
选择(Irms\U tx\U modify\U profile\U ban)新RMS配置文件
{
//将列名指定给属性名
};
//不知道为什么,但如果你不把
//我在这里打电话。
IEnumerable狭窄_results=results.OfType();
InfoFormat(“从横幅中读取{0}条记录。”,缩小了_results.Count());
返回缩小的结果;
}

评论坏事发生的原因是由于。我刚刚发现,如果我调用Count on showned_results(IEnumerable),它将返回正确的数量。如果我在results(IQueryable)上调用它,它只返回200。我将继续解决Skeet的答案(因为他提到了IQueryable和IEnumerable之间的区别),但如果有人能够解释为什么会发生这种情况,我很想听听。

我没有听说过类似的事情,这听起来确实很奇怪

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

我们能看一些示例代码吗

编辑:好的,看到代码后:

  • 当您没有调用OfType时,它正在SQL级别执行计数。这应该在SQL日志中是可见的,并且应该可以使用任何其他SQL工具进行复制

  • 我猜你们真的不需要打电话。您可以调用AsEnumerable,或者只是将
    结果声明为
    IEnumerable
    。重要的是,变量的类型决定了要使用的扩展方法,从而决定了在何处执行计数


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

好吧,其余的东西都用在程序的其他地方了。我确实尝试过将结果声明为IEnumerable,但遇到了同样的问题。我找到的唯一解决方案是添加OfType调用或返回Queryable。我选择前者只是为了避免重构世界。那很奇怪。我仍然有兴趣看到在这种情况下执行了什么样的SQL:)将_dc.Log分配给某个对象,这样您就可以看到生成了什么样的SQL。计数将导致执行查询,并且计数将对加载到内存中的结果进行操作。在IQueryable上执行此操作将导致计数转换到服务器。。。
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;
      }