C# 使用Linq分组如何按特定组排序,然后按其余组降序

C# 使用Linq分组如何按特定组排序,然后按其余组降序,c#,linq,sorting,grouping,C#,Linq,Sorting,Grouping,此代码是select case语句内容的工作示例。它是对链接按钮单击的响应,通过会话变量传入谁的ID。链接按钮代表高(3)中(2)和低(1)风险类别 这里的逻辑是;如果选择“中等”(2),它的相关行(riskCategory=2)将首先显示,然后其余行(risk category)将按降序排列,因此3、2、0) 正如我所说的,为了实现我的目标,我对Linq Concat函数的丑陋实现确实产生了正确的结果,但它也表明了我需要花更多的周末来查看和创建比简单的101链接示例教程项目提供的更复杂的示例

此代码是select case语句内容的工作示例。它是对链接按钮单击的响应,通过会话变量传入谁的ID。链接按钮代表高(3)中(2)和低(1)风险类别

这里的逻辑是;如果选择“中等”(2),它的相关行(riskCategory=2)将首先显示,然后其余行(risk category)将按降序排列,因此3、2、0)

正如我所说的,为了实现我的目标,我对Linq Concat函数的丑陋实现确实产生了正确的结果,但它也表明了我需要花更多的周末来查看和创建比简单的101链接示例教程项目提供的更复杂的示例

必须有一种更优雅的方式来分组和排序,同时允许先对代表所选组的组进行排序,其余组则从下往下排序。再次选择组1 LowRiskCategory,我必须在排序结果集中首先显示LowRiskCategory(1),然后分别显示3、2和0

var midQuery = enumerableVersionTable.Where(x => x["RiskCategory"].Equals(intRiskCategoryEnum));                                    
midQuery.OrderByDescending(v => v["DateOfService"]);
midQuery.OrderBy(v => v["Reviewed"]);

var midQueryZero = enumerableVersionTable.Where(x => x["RiskCategory"].Equals(0));
midQueryZero.OrderByDescending(v => v["DateOfService"]);
midQueryZero.OrderBy(v => v["Reviewed"]);

var midQueryOne = enumerableVersionTable.Where(x => x["RiskCategory"].Equals(1));
midQueryOne.OrderByDescending(v => v["DateOfService"]);
midQueryOne.OrderBy(v => v["Reviewed"]);

var midQueryThree = enumerableVersionTable.Where(x => x["RiskCategory"].Equals(3));
midQueryThree.OrderByDescending(v => v["DateOfService"]);
midQueryThree.OrderBy(v => v["Reviewed"]);

var querySummation = midQuery.Concat(midQueryThree);
querySummation = querySummation.Concat(midQueryOne);
querySummation = querySummation.Concat(midQueryZero);
dtQueryResults = querySummation.CopyToDataTable()
对于情况2,仅在转换后的枚举值之后看到那些硬编码的数字值: 让我觉得很痛苦。一定有更优雅的方式来组织团队。按特定组排序。当然,也可以应用我所有的其他分类,正如你们看到的服务日期和审查

最后,如果你再次投反对票
请至少解释一下为什么谢谢您

只需更改您用于OrderBy的lambda即可。您不仅限于选择一个字段。我将使用第三级表达式根据所选内容选择排序依据

OrderByDescending正在尝试将对象与整数进行比较。如果我理解你所说的,你的意思是,在每一个案例中都有这样的障碍。此外,这段代码只处理您甚至没有将剩余的组/案例附加到查询结果中的所选案例,即使是switch语句的这一特定案例。。。我提议的虽然丑陋的解决方案完全解决了一个案例:案例2:按钮2选择了中间类别。我必须至少在三个案例中重新安排这种丑恶。你的答案甚至没有提到一个案例。我不知道你的数据的签名,我想==必须被一个相等的调用替换。不再需要追加剩余的组,因为我提出的查询中没有过滤。如果您尝试评估它而不是代码示例,您将看到,所有数据都是存在的,并且主要按照风险类别的顺序进行排序:2,0,1,3。根据建议进行测试,替换比较,通过降序特定的“风险类别”,然后按照一般的“风险类别”进行排序,这样做。由于我们指定了第一个“RiskCategory”,所以对下降的疑惑将非常重要。非常感谢。本周末,我将再次回顾所有101 LinQ示例项目,并再次使用方便的代码片段制作我自己的参考解决方案。非常感谢。在每个case语句中,这9行可以成功地再次替换我的15行…降序确实会产生不同,我不明白为什么我建议阅读一些关于IOrderedQueryable接口的内容,以及ThenBy/ThenBy descending和OrderBy/OrderByDescending之间的区别
var dtQueryResults = yourData
            .OrderByDescending(v => v["RiskCategory"] == intRiskCategoryEnum)//true for ==2 goes first, false goes then
            .ThenBy(v => v["RiskCategory"]) //the rest is sorted normally
            .ThenBy(v => v["Reviewed"]) //inside the groups, the rest of your sorts is used
            .ThenByDescending(v => v["DateOfService"]);