Задача состоит в том, чтобы преобразовать из цепочки методов в стандартный 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, но что-то не так.
То, что происходит, похоже на это ..
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()
});





Эта задача помогла мне понять, что именно возвращает Linq Group By (и насколько многословен синтаксис Linq с Group By).
Как ясно показывает LinqPad, Группа по возвращает List из Groups. Group - очень простой класс, который имеет только одно свойство: a Ключ
Как утверждает этот ответ, из определения IGrouping (IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable) способ Только доступа к содержимому подгрупп - это итерация по элементам (foreach, другая группа по, выбор и т. д.).
Здесь показана синтаксическая формулировка цепочки методов Linq.
Но давайте попробуем найти другое решение:
Что мы обычно делаем в SQL, когда делаем Группа по, так это перечисляем все столбцы но, которые были сгруппированы. С Linq все иначе .. он по-прежнему возвращает ВСЕ столбцы.
В этом примере мы начали с набора данных с 3 «столбцами» {IDMacroTab, IDTab, IDSlot}. Мы сгруппировались по первому столбцу, но Linq вернет весь набор данных, если мы явно не скажем ему ..