【问题标题】:Groupby followed by orderby keeping the group intact and then sort individual groupGroupby 后跟 orderby 保持组不变,然后对单个组进行排序
【发布时间】:2020-01-06 18:01:12
【问题描述】:

这对我来说使用 LINQ 似乎有点困难。我有一个警报列表,警报看起来像:

 public short AlertTypeId { get; set; }
 public string Type { get; set; }
 public int Severity { get; set; }
 public bool IsOverview { get; set; }
 public string Title { get; set; }
 public string Text { get; set; }
 public int Position { get; set; }
 public string Id { get; internal set; }
  1. 我想首先按 alertIDType 对这些警报进行分组,
  2. 在 desc 和 ... 中按严重性对单个组中的元素进行排序
  3. 然后按特定顺序按相同的 alertIDType 对整个组进行排序(我有一个用于下面提到的 utils 排序器)

目前排序代码如下:

var alerts = new BPAlerts
        {
            AllAlerts = intakeAlerts.Select(
                alert => new BPAlert
                {
                    AlertTypeId = alert.AlertTypeId ?? 8100,
                    IsOverview = alert.IsOverviewAlert.GetValueOrDefault(),
                    Text = alert.AlertText,
                    Title = alert.AlertTitle,
                    Type = alert.AlertTypeId == 8106 ? "warning" : "report",
                    Severity = alert.AlertSeverity.GetValueOrDefault(),
                    Position = alert.Position.GetValueOrDefault()
                }).ToList()
        };

        alerts.AllAlerts = alerts.AllAlerts.GroupBy(a => a.AlertTypeId)
                .OrderByDescending(g => Utils.AlertSorterUtil.SortByAlertTypeId(g.Key))
                .SelectMany(g => g.OrderByDescending(a => a.Severity)).ToList();

        // Alerts displayed on the overview page
        alerts.OverviewAlerts =
            alerts.AllAlerts
                .ToList()
                .Where(a => a.IsOverview && !string.IsNullOrEmpty(a.Title))
                .Take(3)
                .ToList();

Utils sorter 方法如下:

public class AlertSorterUtil
{
    public static int SortByAlertTypeId(short alertTypeId)
    {
        var orderArray = new int[]
        {
            8106,   // Confirmed Out of Business
            8105,   // Bankruptcy
            8111,   // Lack of Licensing
            8109,   // Investigations
            8103,   // Government Actions
            8104,   // Pattern of Complaints
            8112,   // Customer Reviews
            8110,   // Accreditation
            8101,   // Misuse of BBB Name
            8107,   // Advisory
            8102,   // Advertising Review
        };

        for (int orderValue = 0; orderValue < orderArray.Length; orderValue++)
        {
            if (alertTypeId == orderArray[orderValue])
            {
                return orderValue;
            }
        }

        return int.MaxValue;
    }
}

【问题讨论】:

  • 您是否尝试添加GroupBy?我没有看到您尝试在帖子中对这些内容进行分组。
  • 是的,我有。分组后是什么?你如何对单个组的元素进行排序?然后根据他们的 alertID 分组属性重新排列整个组?

标签: c# asp.net .net entity-framework linq


【解决方案1】:

假设您有一个警报列表来执行所有这些操作。使用 LINQ 执行以下操作。它将按 AlertTypeId 对警报进行分组,然后按 AlertTypeId 对组进行排序,最后按 Severity asc 对各个组进行排序。

var groupedAlerts = alerts.GroupBy(a => a.AlertTypeId).OrderBy(g => Utils.AlertSorterUtil.SortByAlertTypeId(g.Key)).Select(g => g.OrderByDescending(a => a.Severity).ToList()).ToList();

【讨论】:

  • 谢谢 :) 但是为了对组进行排序,我使用上面提到的 util 方法有一个自定义逻辑:我需要做“var groupedAlerts = alerts.GroupBy(a => a.AlertTypeId ).OrderBy(g => Utils.AlertSorterUtil.SortByAlertTypeId(g.Key) ).Select(g => g.OrderByDescending(a => a.Severity).ToList()).ToList();"
  • 我的错误。在我上面的评论中,我需要按严重性对组的各个元素进行排序,并按 alertID 对各个组进行排序。你能编辑你的答案以反映变化吗?
  • 不是已经在做同样的事情了吗,组按 AlertTypeId 排序,每个组中的元素按 Severity 排序?
  • 当然。让我进行一些测试,一旦完成,我会的。我相信很多人都可以从中得到帮助:)
  • 已批准。再次感谢您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
相关资源
最近更新 更多