Задача Linq: преобразование этого фрагмента кода из цепочки методов в стандартный Linq - PullRequest
0 голосов
/ 11 октября 2018

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

Контекст

Чтобы полностью понять тему, вы можете прочитать исходный вопрос (с определениями классов, примерами данных и т. д.): 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

enter image description here

Классы и примеры данных на NetFiddle:

https://dotnetfiddle.net/8mF1qI

1 Ответ

0 голосов
/ 11 октября 2018

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

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

enter image description here

As этот ответ утверждает, из определения IGrouping (IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable), что only способ доступа к содержимому подгрупп - это итерация по элементам (foreach, другая группа,выберите, ecc).

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

enter image description here

А здесьисходный код на Fiddle

Но давайте продолжим пытаться найти другое решение:

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

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

enter image description here

...