C# - Lambda - группировка данных списка, содержащих вложенные объекты списка - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь сгруппировать список с внутренними списками, чтобы получить меньший результат, используя C# лямбда, но, к сожалению, безуспешно.

Я получил следующий запрос, который возвращает 8 записей:

+--------------+----------------+---------+-------------+-----------+-------------+----------+----------------------+----------+--------------+-----------+
| DepartmentId | DepartmentName | RoomId  |  RoomName   | ElementId | ElementName | ActionId |      ActionName      | TimeNorm | ElementCount | ProjectId |
+--------------+----------------+---------+-------------+-----------+-------------+----------+----------------------+----------+--------------+-----------+
|      1378195 | BG             | 1414848 | TestRuimte  |   1279320 | toilet      |  1279319 | kalk verwijderen     |       90 |            2 |   1377945 |
|      1378195 | BG             | 1414848 | TestRuimte  |   1279320 | toilet      |  1281322 | klamvochtig reinigen |       40 |            1 |   1377945 |
|      1378195 | BG             | 1414849 | TestRuimte2 |   1279320 | toilet      |  1279319 | kalk verwijderen     |       90 |            2 |   1377945 |
|      1378195 | BG             | 1414849 | TestRuimte2 |   1279320 | toilet      |  1281322 | klamvochtig reinigen |       40 |            1 |   1377945 |
|      1378195 | BG             | 1414850 | TestRuimte3 |   1279320 | toilet      |  1279319 | kalk verwijderen     |       40 |            1 |   1377945 |
|      1378195 | BG             | 1414850 | TestRuimte3 |   1279320 | toilet      |  1281322 | klamvochtig reinigen |      120 |            2 |   1377945 |
|      1378195 | BG             | 1414851 | TestRuimte4 |   1279320 | toilet      |  1279319 | kalk verwijderen     |       90 |            2 |   1377945 |
|      1378195 | BG             | 1414851 | TestRuimte4 |   1279320 | toilet      |  1281322 | klamvochtig reinigen |       40 |            1 |   1377945 |
+--------------+----------------+---------+-------------+-----------+-------------+----------+----------------------+----------+--------------+-----------+

Результат сохраняется в объекте List:

List<dDepartment> test

Класс dDepartment выглядит следующим образом:

public class dDepartment
{
    public int DepartmentId { get; set; }
    public string DepartmentName { get; set; }
    public List<dRoom> Rooms { get; set; }
}

public class dRoom
{
    public int RoomId { get; set; }
    public string RoomName { get; set; }
    public List<dElement> Elements { get; set; }
}

public class dElement
{
    public int ElementId { get; set; }
    public string ElementName { get; set; }
    public List<dAction> Actions { get; set; }
}

public class dAction
{
    public int ActionId { get; set; }
    public string ActionName { get; set; }
    public int TimeNorm { get; set; }
    public int ElementCount { get; set; }

}

Объект списка возвращает 8 записей, в которых списки вложенных классов, что хорошо. Однако я хочу сгруппировать этот результат по DepartmentId, RoomdId, ElementId и ActionId. Таким образом, список должен возвращать 1 отдел со списком внутри него, содержащим 4 комнаты, со списком внутри комнат, содержащим 1 элемент, и списком внутри элемента, содержащим 2 действия.

Итак, он должен возвращать что-то вроде этого:

(Count 1) DepartmentId = 1378195, DepartmentName = BG, 
Rooms (count 4) = 
{[
  Room[0] = RoomdId = 1414848, RoomName = TestRuimte, Elements (count 1) = {[Element[0] = ElementId = 1279320, ElementName = toilet, Actions (count 2) = {[]...} ]}
  Room[1] = RoomdId = 1414849, RoomName = TestRuimte2, Elements (count 1) = {[Element[0] = ElementId = 1279320, ElementName = toilet, Actions (count 2) = {[]...} ]}
  Room[2] = RoomdId = 1414850, RoomName = TestRuimte3, Elements (count 1) = {[Element[0] = ElementId = 1279320, ElementName = toilet, Actions (count 2) = {[]...} ]}
  Room[3] = RoomdId = 1414851, RoomName = TestRuimte4, Elements (count 1) = {[Element[0] = ElementId = 1279320, ElementName = toilet, Actions (count 2) = {[]...} ]}
]}

Однако я могу получить правильный результат после попытки нескольких группировок лямбда, например:

var grouped = test.GroupBy(g => new
{
    DepartmentId = g.DepartmentId,
    //Rooms = g.Rooms.GroupBy(gg => new
    //{
    //    gg.RoomId
    //}).ToList()
}).Select(s => new
{
    s.Key.DepartmentId,
    //Rooms = test.GroupBy(g => new 
    //{
    //    g.
    //))

    Rooms = test.Select(r => new { 
        r.Rooms
    }).GroupBy(g => g.Rooms.Select(t => t.RoomId)).ToList()
}).ToList();

1 Ответ

2 голосов
/ 17 июня 2020

Я обычно так делаю

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
    {
        static void Main(string[] args)
        {
            List<dDepartment> depts = new List<dDepartment>();

            var results = depts
                .SelectMany(g => g.Rooms
                    .SelectMany(s => s.Elements.Select( e => new { 
                        deptId = g.DepartmentId, 
                        deptName = g.DepartmentName, 
                        roomId = s.RoomId, 
                        roomName = s.RoomName,
                        elementId = e.ElementId,
                        elementName = e.ElementName
                    })
                    )).GroupBy(g => new {g.deptId, g.roomId})
                    .ToList();

        }
    }
    public class dDepartment
    {
        public int DepartmentId { get; set; }
        public string DepartmentName { get; set; }
        public List<dRoom> Rooms { get; set; }
    }

    public class dRoom
    {
        public int RoomId { get; set; }
        public string RoomName { get; set; }
        public List<dElement> Elements { get; set; }
    }

    public class dElement
    {
        public int ElementId { get; set; }
        public string ElementName { get; set; }
        public List<dAction> Actions { get; set; }
    }

    public class dAction
    {
        public int ActionId { get; set; }
        public string ActionName { get; set; }
        public int TimeNorm { get; set; }
        public int ElementCount { get; set; }

    }


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...