EF Core LINQ查询出现“Nullable object must have a value”异常的解决方法
修复左连接LINQ查询中Average方法的空值异常
问题出在左连接后,当Y表无匹配记录时,分组序列里会包含null的Y实例。调用Average计算时,若分组内没有有效(非null)的SomeFloatValue,Average会返回null(因为float?类型的平均值在无有效数据时为null),此时直接强制转换为int就会触发“Nullable object must have a value”异常。
以下是几种修复方案:
方案1:给空结果指定默认值
在select阶段先将Average的结果转为可空整数,再用空合并运算符设置默认值(比如0),避免空值强制转换:
List<int> averages = await (from x in ctx.X join y in ctx.Y on x.Id equals y.XId into j from xy in j.DefaultIfEmpty() where x.clientId == 5 group xy by x.Magnitude into g orderby g.Key select (int?)g.Average(x => x?.SomeFloatValue) ?? 0 ).ToListAsync();
方案2:过滤分组中的null元素
如果不需要统计无匹配Y记录的分组,可以先过滤掉null的Y实例,再计算平均值,同时处理空结果:
List<int> averages = await (from x in ctx.X join y in ctx.Y on x.Id equals y.XId into j from xy in j.DefaultIfEmpty() where x.clientId == 5 group xy by x.Magnitude into g orderby g.Key select (int)(g.Where(item => item != null).Average(item => item.SomeFloatValue) ?? 0) ).ToListAsync();
方案3:使用可空整数接收结果
如果需要保留“无匹配时为null”的业务语义,可以将结果类型改为List<int?>,后续再根据需求处理空值:
List<int?> averages = await (from x in ctx.X join y in ctx.Y on x.Id equals y.XId into j from xy in j.DefaultIfEmpty() where x.clientId == 5 group xy by x.Magnitude into g orderby g.Key select (int?)g.Average(x => x?.SomeFloatValue) ).ToListAsync();
内容的提问来源于stack exchange,提问作者John L.
相关产品推荐
相关产品推荐

