我有以下 LINQ 到实体查询
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。结果类型的泛型参数或查询必须使用可为 null 的类型。
问题是gr。最后一行的 count(),但我找不到解决方案。 我试图测试 gr 是否为空,但找不到有效的方法。
我已经看到了许多使用 Sum() 而不是 Count() 来解决类似问题的解决方案,但我无法使它们适应我的问题。
我尝试将我的查询更改为类似于 Linq 问题中的组和计数中的查询,但我只是收到了不同的消息。
我还查看了实体框架(以及其他一些)中的组和计数,但问题是不同的。
组键不能为空
var results = ctx.Rs.Where(r => r.QK != null)
.GroupBy(r => r.QK)
.Select(gr => new { Key = (int)gr.Key, Count = gr.Count() }
.ToList();
附言。
大多数情况下,实体框架中不需要"JOIN"语法。 请参阅: 加载相关实体
编写具有描述意义的变量名称将显著改善您的代码并使其易于理解。可读性在实际生产中确实很重要。
我在阅读您的格式时遇到问题。但是你能试试吗:
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) }
随着DefaultIfEmpty
和x => x.RK != null
的变化。