Если ваш список родителей уже существует, вы не хотите делать это полностью в LINQ. Мы будем использовать LINQ, чтобы сгруппировать детей с братьями и сестрами, затем обойдем их обычным образом и назначим родительские свойства Children. Если родителей достаточно, чтобы поиск был проблемой эффективности, поместите их в словарь.
foreach (var g in children.GroupBy(ch => ch.ParentId))
{
// Use Single() rather than FirstOrDefault() if orphans are forbidden.
// It will throw an exception if no match is found.
var parent = parents.FirstOrDefault(p => p.Id == g.Key);
if (parent != null)
{
parent.Children = g.ToList();
}
}
Законная опция pure-LINQ, как отмечает Тим, заключается в создании новых родительских объектов. В этом нет ничего плохого. То, что вы не хотите делать, это написать запрос LINQ, который изменяет входные объекты. Это обычно заканчивается слезами. Приведенный выше шаблон используется в коде, где я работаю, потому что у нас есть большие классы POCO со многими свойствами и нет необходимости в конструкторах копирования.