Linq分组匿名对象后DateTime排序失效问题(ThisDate为可空类型)
解决可空日期分组后排序异常的问题
你的代码中先对ThisDate降序再分组,但GroupBy操作不会保留原有的排序结果,后续的Distinct也可能进一步打乱顺序,导致最终列表无法按「年份降序、同年份下月份降序」的预期排列。另外,直接调用i.ThisDate.Value存在空引用风险,需要先过滤空值记录。
修正后的代码如下:
ThisDateList = await ctx.Table1 .Where(i => i.ThisDate.HasValue) // 过滤空日期,避免Value调用报错 .GroupBy(i => new { i.ThisDate.Value.Year, i.ThisDate.Value.Month }) .OrderByDescending(g => g.Key.Year) // 按年份降序排序 .ThenByDescending(g => g.Key.Month) // 同年份下按月份降序排序 .Select(g => $"{g.Key.Year} {DateTimeFormatInfo.InvariantInfo.GetMonthName(g.Key.Month)}") .ToListAsync();
关键调整说明:
- 增加
Where(i => i.ThisDate.HasValue)过滤空日期,避免访问Value时触发空引用异常。 - 分组后直接基于分组键的
Year和Month做降序排序,确保结果严格遵循「最新年份→同年份下最新月份」的顺序。 - 移除
Distinct,因为GroupBy已经保证每个「年-月」组合唯一,无需额外去重。
内容的提问来源于stack exchange,提问作者BlueCardinal
相关产品推荐
相关产品推荐

