Задача Linq: преобразование этого фрагмента кода из цепочки методов в стандартный Linq

Задача состоит в том, чтобы преобразовать из цепочки методов в стандартный linq фрагмент кода, заполненный group by.

Контекст

Чтобы полностью понять тему здесь, вы можете прочитать исходный вопрос (с определениями классов, образцами данных и т. Д.): Linq: восстановить иерархические данные из упорядоченного списка

Благодаря @Akash Kava я нашел решение своей проблемы.

Формулировка цепного метода

var macroTabs = flattenedList
        .GroupBy(x => x.IDMacroTab)
        .Select((x) => new MacroTab
        {
            IDMacroTab = x.Key,
            Tabs = x.GroupBy(t => t.IDTab)
                    .Select(tx => new Tab {
                        IDTab = tx.Key,
                        Slots = tx.Select(s => new Slot {
                           IDSlot = s.IDSlot
                     }).ToList()
            }).ToList()
        }).ToList();

Но, ради знания, я попытался преобразовать цепочку методов в стандартную формулировку Linq, но что-то не так.

То, что происходит, похоже на это ..

Моя попытка преобразовать его в стандартный синтаксис Linq

var antiflatten = flattenedList
    .GroupBy(x => x.IDMacroTab)
    .Select(grouping => new MacroTab
    {
        IDMacroTab = grouping.Key,
        Tabs = (from t in grouping
                group grouping by t.IDTab
                into group_tx
                select new Tab
                {
                    IDTab = group_tx.Key,
                    Slots = (from s in group_tx
                    from s1 in s    
                    select new Slot
                    {
                        IDSlot = s1.IDSlot
                    }).ToList()
                }).ToList()
    });

Результат в LinqPad

введите описание изображения здесь

Классы и образцы данных в NetFiddle:

https://dotnetfiddle.net/8mF1qI


person Revious    schedule 11.10.2018    source источник


Ответы (1)


Эта задача помогла мне понять, что именно возвращает Linq Group By (и насколько многословен синтаксис Linq с Group By).

Как ясно видно из LinqPad, Group By возвращает List из Groups. Group - очень простой класс, у которого есть только одно свойство: Ключ

введите здесь описание изображения

Как указано в этом ответе, из определения IGrouping (IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable) единственный способ доступа к содержимое подгрупп должно перебирать элементы (foreach, другая группа by, select и т. д.).

Здесь показана синтаксическая формулировка цепочки методов Linq.

введите здесь описание изображения

А вот исходный код на Fiddle

Но давайте попробуем найти другое решение:

Что мы обычно делаем в SQL при выполнении Группировать по, так это перечисляем все столбцы, кроме того, который был сгруппирован. С Linq все иначе ... он по-прежнему возвращает ВСЕ столбцы.

В этом примере мы начали с набора данных с 3 «столбцами» {IDMacroTab, IDTab, IDSlot}. Мы сгруппировались по первому столбцу, но Linq вернет весь набор данных, если мы явно не скажем ему ..

введите здесь описание изображения

person Revious    schedule 11.10.2018