如何使用LINQ按多列组合值对Orders表按最后交互时间排序
解决方案
核心逻辑是直接将「最后交互时间」作为排序字段:如果Modified有值则取Modified,为空则取Created,直接对该合并后的字段升序排序即可。
C# LINQ 写法
直接用空合并运算符构造排序字段:
orders.OrderBy(o => o.Modified ?? o.Created)
逻辑验证
对示例数据的计算结果如下:
- 订单4:Modified为空,取Created = 2019-01-10
- 订单3:取Modified = 2019-02-25
- 订单1:Modified为空,取Created = 2019-12-24
- 订单2:取Modified = 2020-01-10
按上述时间升序排序后的顺序正好是 4、3、1、2,完全符合预期。
补充说明
如果用的是不支持空合并运算符的旧版ORM框架,也可以用三元表达式实现等价逻辑:
orders.OrderBy(o => o.Modified.HasValue ? o.Modified : o.Created)
两种写法在EF Core等主流ORM中都会被正确翻译成对应的SQL语句(比如SQL Server里的ISNULL(Modified, Created)、MySQL里的IFNULL(Modified, Created)),无需担心性能问题。
内容的提问来源于stack exchange,提问作者Stephan Kal
相关产品推荐
相关产品推荐

