You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:30:47