【问题标题】:LINQ to Entities group by and Count()LINQ to Entities 按和 Count() 分组
【发布时间】:2013-01-23 12:57:34
【问题描述】:

我有以下 LINQ-to-Entities 查询

from r in ctx.Rs
join p in ctx.Ps on r.RK equals p.RK
group r by r.QK into gr
select new { QK = (int)gr.Key, Num = gr.Count() }

针对此架构运行

Table P  Table R   Table Q
 PK*
 RK ----> RK*
 Text     QK ------> QK*
          Text       Text

如果 Q 中有任何记录而 P 中没有相应记录,则给出此消息:“转换为值类型 'Int32' 失败,因为具体化值为 null。结果类型的通用参数或查询必须使用可空类型。”

问题是最后一行中的 gr.Count(),但我找不到解决方案。我试图测试 gr 是否为 null,但找不到可行的方法。

我已经看到了许多使用 Sum() 而不是 Count() 来解决类似问题的解决方案,但我无法使它们适应我的问题。

我尝试将查询更改为与 Group and Count in Linq issue 中的查询类似,但我收到了不同的消息。

我还查看了Group and Count in Entity Framework(以及其他一些),但问题有所不同。

【问题讨论】:

    标签: c# linq entity-framework count group-by


    【解决方案1】:

    组键不能为空

    var results = ctx.Rs.Where(r => r.QK != null)
        .GroupBy(r => r.QK)
        .Select(gr => new { Key = (int)gr.Key, Count = gr.Count() }
        .ToList();
    

    PS。

    1. 大多数情况下,实体框架中不需要“JOIN”语法。见:Loading Related Entities

    2. 编写具有描述性意义的变量名将显着改善您的代码并使其易于理解。可读性在现实世界的制作中确实很重要。

    【讨论】:

    • 嗯,实际上它并不完美。它运行良好,但给出了错误的答案,因为它包含不在 P 中的 Rs。当我尝试通过连接修复它时,我得到了相同的消息。还有另一种方法可以排除不在 P 中的 Rs 吗?还有其他建议吗?
    • 我确实让您的解决方案正常工作并返回了正确的结果。关键是解决方案第一行中的 '.Where(r => r.QK != null)'。再次感谢。
    【解决方案2】:

    我无法阅读您的格式。但是你能试试吗:

    from r in ctx.Rs
    join p in ctx.Ps.DefaultIfEmpty() on r.RK equals p.RK
    group r by r.QK into gr
    select new { QK = (int)gr.Key, Num = gr.Count(x => x.RK != null) }
    

    更改为 DefaultIfEmptyx => x.RK != null

    【讨论】:

    • 感谢您的回答。不幸的是,这仍然给出了相同的信息。
    猜你喜欢
    • 2021-10-13
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2012-04-22
    相关资源
    最近更新 更多