9

我有以下 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 是否为空,但找不到可行的方法。

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

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

我还查看了实体框架(以及其他一些)中的组和计数,但问题有所不同。

4

2 回答 2

18

组键不能为空

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' 语法。请参阅:加载相关实体

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

于 2013-01-23T04:57:34.517 回答
5

我无法阅读您的格式。但是你可以试试:

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正在发生的变化。

于 2013-01-23T04:53:03.727 回答