合并父母名单和孩子名单

时间:2019-05-10 19:45:51

标签: c# entity-framework linq

是否可以使用Linq将父对象列表与子对象列表组合在一起,以便父列表包括具有相同ID的子对象?

我有一个没有孩子的父母名单,还有一个单独的孩子名单,想合并他们,以便在父母名单中有合适的父母包括的孩子。

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 个答案:

答案 0 :(得分:3)

如果我理解正确,您将有两个列表,如下所示:

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

然后您可以将父母与孩子一起加入,以创建附加了孩子的新Parent对象:

var newParents = parents.GroupJoin(
     children, 
     parent => parent.Id, 
     child => child.ParentId, 
     (parent, children) => new Parent { Id = parent.Id, Children = children.ToList() });

答案 1 :(得分:1)

如果您的父母名单已经存在,则您不想在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();
    }
}
正如Tim所指出的,

合法的纯LINQ选项是创建新的Parent对象。没有错。您不想做的是编写一个LINQ查询来更改输入对象。那通常以眼泪结束。上面的模式用在我工作的代码中,因为我们有带有许多属性的大型POCO类,并且不需要复制构造函数。