【问题标题】:Linq2Entites Count() with condition on bool not working as "I thought it would"?带有布尔条件的 Linq2Entites Count() 不能像“我认为它会”那样工作?
【发布时间】:2013-01-15 18:15:00
【问题描述】:

给定以下非常简单的 linq 语句

vm.VerifiedGroups = db.ReportGroups.Count(g => g.Verified);

vm.VerifiedGroups = db.ReportGroups.Count(g => g.Verified == true);

Verified 是一个布尔值,我收到一个异常说 linq-2-entities 不支持?

错过了一些非常简单的事情 - 或者我应该从以下选项中选择一个:

a)
vm.VerifiedGroups = db.ReportGroups.Where(g => g.Verified).Count();

b)
vm.VerifiedGroups = db.ReportGroups.ToList().Count(g => g.Verified);

这两种方法都有效(我的列表只有 30-50 长,所以 ToList 不是问题)。

【问题讨论】:

    标签: c# linq entity-framework-4 linq-to-entities


    【解决方案1】:

    你没有错过任何东西。 Linq to Entity 不支持使用谓词计数。见msdn文章Supported and Unsupported LINQ Methods (LINQ to Entities)

    是的,您应该使用第一个选项,因为ToList() 将执行查询并将所有实体带入内存:

    vm.VerifiedGroups = db.ReportGroups.Where(g => g.Verified).Count();
    

    即使您的ReportGroups 表中没有很多记录,您为什么要做一些更慢、使用更多电脑、数据库和网络资源的事情?比较传输一个整数值与传输 50 个ReportGroup 实体的所有字段,从DataReader 创建.net 对象(并保持打开的连接),并迭代创建的列表,对每个DataReader 实体执行谓词方法。我认为传输一个整数值在这里获胜。

    【讨论】:

    • 由于链接和解释而获得积分:实际上我需要结果集中的多个值 - 所以会看到哪个更快:将所有记录加载到列表中,然后运行 ​​5 个查询反对(然后在需要时支持计数谓词)或使用Where().Count()签名运行5个查询。
    【解决方案2】:

    我会选择第一个选项,因为 first 不会带来所有记录来计算计数。在第二个选项中,ToList 方法将带来数据并对其应用计数。

    vm.VerifiedGroups = db.ReportGroups.Where(g => g.Verified).Count();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多