C# LINQ按多字段排序 实现QuestionDataTypeId=0的数据排在末尾
问题原因
你原有代码的问题出在OrderByDescending的使用:当判断表达式返回布尔值时,true的排序权重要高于false,所以会把QuestionDataTypeId=0的行排到最前面,和你要的"0值排最后"的需求完全相反。
正确单条LINQ实现
两种写法都可以实现需求,推荐用可读性更高的三元运算符写法:
var data = entity // 第一优先级:非0行排前,0行排后 .OrderBy(m => m.QuestionDataTypeId == 0 ? 1 : 0) // 第二优先级:按QuestionDataTypeId升序排列 .ThenBy(m => m.QuestionDataTypeId) // 第三优先级:同类型下按DisplayOrder升序排列 .ThenBy(m => m.DisplayOrder);
也可以直接对布尔结果升序排列,利用false < true的默认排序规则,效果和上面完全一致:
var data = entity .OrderBy(m => m.QuestionDataTypeId == 0) .ThenBy(m => m.QuestionDataTypeId) .ThenBy(m => m.DisplayOrder);
补充说明
以上两种写法都可以被EF Core等ORM框架正确翻译为SQL的CASE WHEN排序逻辑,不管是内存集合排序还是数据库查询都可以正常生效,不需要拆分两次查询再合并结果。
内容的提问来源于stack exchange,提问作者Bharat
相关产品推荐
相关产品推荐

