Объединить список родителей со списком детей - PullRequest
0 голосов
/ 10 мая 2019

Есть ли способ с помощью Linq объединить список родительских объектов со списком дочерних объектов, чтобы родительский список включал дочерние объекты с одинаковыми идентификаторами?

У меня есть список родителей без детей и отдельный список детей, и я хочу объединить их, чтобы в список родителей были включены дети с соответствующим родителем.

public class Parent
{
    public int Id { get; set; }
    public virtual List<Children> Children { get; set; }
}

public class Children
{
    public int Id { get; set; }
    public int ParentId { get; set; }
}

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Если я правильно понимаю, у вас есть два списка следующим образом:

List<Parent> parents;
List<Children> children;

Затем вы можете объединить родителей с детьми, чтобы создать новые родительские объекты, к которым прикреплены дети:

var newParents = parents.GroupJoin(
     children, 
     parent => parent.Id, 
     child => child.ParentId, 
     (parent, children) => new Parent { Id = parent.Id, Children = children.ToList() });
1 голос
/ 10 мая 2019

Если ваш список родителей уже существует, вы не хотите делать это полностью в 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 со многими свойствами и нет необходимости в конструкторах копирования.

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