【问题标题】:Using Linq Grouping how to I order by specific Group then remaining Groups descending使用 Linq Grouping 如何按特定组排序,然后剩余组降序
【发布时间】:2014-06-27 16:18:26
【问题描述】:

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

这里的逻辑是;如果您选择 Medium(2),则首先显示相关行 (riskCategory =2),然后其余行 (risk category) 按降序排列,因此 3 然后 2 然后 0)

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

必须有一种更优雅的分组和排序方式,同时允许先对代表所选组的组进行排序,其余组按降序排列。再次选择 Group 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 的翻译后的枚举值之后看到那些硬编码的数字值: 让我想投掷。必须有更优雅的方式来进行分组。按特定组订购。当然也可以应用我所有其他奇怪的排序,如您所见的服务日期和审核日期。

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

【问题讨论】:

    标签: c# linq sorting grouping


    【解决方案1】:
    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"]);
    

    【讨论】:

    • 您的 OrderByDescending 正在尝试将对象与整数进行比较。如果我理解你所表达的意思,那么在每种情况下都有这样的块。此外,此代码仅解决了您甚至没有将剩余的组/案例附加到查询结果中的选定案例,即使是 switch 语句的这一特定案例......我提出的尽管 UGLY 解决方案完全解决了一个案例案例 2:按钮2 选择了中间类别。在至少三种情况下,我必须拥有这种丑陋(重新排列)。您的回答甚至没有解决单一案例
    • 我不知道你的数据的签名,我猜 == 必须被一个 Equals 调用替换。不再需要附加剩余的组,因为我提出的查询中没有过滤。如果您尝试评估它而不是代码示例,您将看到所有数据都存在并且主要按 RiskCategory 的顺序排序:2,0,1,3。
    • 经过测试,按照推荐替换比较,通过降序特定“风险类别”然后按通用“风险类别”排序,这让我们感到惊讶。由于我们指定了第一个“RiskCategory”,因此想知道降序非常重要,非常感谢。这个周末我将再次审查所有 101 个 LinQ 示例项目,并再次使用方便的 sn-ps 制作我自己的参考解决方案。谢谢 !!这 9 行在每个 case 语句中都可以再次成功替换我的 15 行...
    • 降序确实有影响,但我不明白为什么
    • 我建议阅读一些关于 IOrderedQueryable 接口以及 ThenBy/ThenByDescending 和 OrderBy/OrderByDescending 之间的区别
    【解决方案2】:

    只需更改您用于 OrderBy 的 lambda。您不仅限于选择一个领域。我会使用三级表达式来根据所选内容选择要排序的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-11
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多