Linq to Entity中对可能为null的选中对象排序问题求助
解决LINQ排序时子对象为null引发异常的问题
针对你遇到的问题,这里提供几种可行的解决思路:
1. 正确使用空传播运算符(?.)
把空传播运算符移到FirstOrDefault的调用之后,而非筛选条件的括号内。当FirstOrDefault返回null时,?.AddedOn会直接返回null,不会触发空引用异常:
var ordered = grouped .OrderBy(x => x.Spell.SpellStatuses .FirstOrDefault(s => !s.NextStatusId.HasValue && s.SpellStatusId == LACompleteStatusId)? .AddedOn);
2. 结合null合并运算符(??)指定默认排序值
如果你想控制null项的排序位置(比如让它们排在最前或最后),可以用null合并运算符给null场景设置默认日期:
// 让null项排在最前面(使用DateTime.MinValue) var ordered = grouped .OrderBy(x => x.Spell.SpellStatuses .FirstOrDefault(s => !s.NextStatusId.HasValue && s.SpellStatusId == LACompleteStatusId)? .AddedOn ?? DateTime.MinValue); // 让null项排在最后面(使用DateTime.MaxValue) var ordered = grouped .OrderBy(x => x.Spell.SpellStatuses .FirstOrDefault(s => !s.NextStatusId.HasValue && s.SpellStatusId == LACompleteStatusId)? .AddedOn ?? DateTime.MaxValue);
3. 提前筛选非null结果(可选)
如果只关心存在匹配状态的项,可以先过滤掉没有匹配的元素再排序:
var ordered = grouped .Where(x => x.Spell.SpellStatuses .Any(s => !s.NextStatusId.HasValue && s.SpellStatusId == LACompleteStatusId)) .OrderBy(x => x.Spell.SpellStatuses .First(s => !s.NextStatusId.HasValue && s.SpellStatusId == LACompleteStatusId) .AddedOn);
这种方式会直接排除无符合条件状态的分组,适合不需要保留null项的场景。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

