В настоящее время я возвращаю список с именами инцидентов и датами появления. Я группирую возвращенный список по месяцам и годам. Мне нужно включить еще один элемент в этот список, который представляет собой другой список, сгруппированный по именам инцидентов и общее количество по инцидентам. У меня группировка по годам и месяцам работает, есть проблемы со второй частью.

Мои модели:

public class IncidentTrendList
{
    public int Year { get; set; }
    public int Month { get; set; }
    public List<IncidentList> IncidentList { get; set; }
}

public class IncidentList
{
    public int IncidentTotal { get; set; }
    public string IncidentName { get; set; }
}

public class IncidentRiskMatrix
{
    public DateTime Date { get; set; }
    public string IncidentName { get; set; }
}

Группировка по логике:

  var groupedList = IncidentRiskMatrix
                  .GroupBy(u => new
                  {
                     Month = u.Date.Month,
                     Year = u.Date.Year,
                  })
                 .Select(grp => new IncidentTrendList
                  {
                     Month = grp.Key.Month,
                     Year = grp.Key.Year,
                     IncidentList ---> this is a list
                  }).ToList();

После группировки в .Select (IncidentList). Как бы я сгруппировал имена инцидентов и общее количество по инцидентам и добавил бы этот элемент в этот список "IncidentList".

1
Miguel Reece 16 Апр 2019 в 19:26

2 ответа

Лучший ответ

Если вы называете свои классы более подходящим образом:

public class IncidentTrend
{
    public int Year { get; set; }
    public int Month { get; set; }
    public List<IncidentsByType> IncidentsByType { get; set; }
}

public class IncidentsByType
{
    public int Total { get; set; }
    public string Name { get; set; }
}

public class IncidentRiskMatrix
{
    public DateTime Date { get; set; }
    public string IncidentName { get; set; }
}

Ответ становится более очевидным:

var groupedList = incidentsRiskMatrix
    .GroupBy(u => new
    {
        u.Date.Month,
        u.Date.Year
    })
    .Select(grp => new IncidentTrend
    {
        Month = grp.Key.Month,
        Year = grp.Key.Year,
                       // from each group
        IncidentsByType = grp
            // group the items by their IncidentName
            .GroupBy(x => x.IncidentName)
            // and select new IncidentByType
            .Select(x => new IncidentsByType
            {
                // by getting the amount of items in the group
                Total = x.Count(),
                // and the key of the group
                Name = x.Key
            })
            .ToList()
    })
    .ToList();
2
Camilo Terevinto 16 Апр 2019 в 17:07

Пытаться:

var groupedList = new List<IncidentRiskMatrix>() //change this to the list of IncidentRiskMatrix variable
                  .GroupBy(u => new
                  {
                     Month = u.Date.Month,
                     Year = u.Date.Year,
                  })
                 .Select(grp => new IncidentTrendList
                 {
                    Month = grp.Key.Month,
                    Year = grp.Key.Year,
                    IncidentList = grp.GroupBy(x => x.IncidentName).Select(y => new IncidentList()
                                                  {
                                                     IncidentName = y.Key,
                                                     IncidentTotal = y.Count()
                                                  }
                                             ).ToList()
                 }).ToList();
0
Matt.G 16 Апр 2019 в 17:03