是否可以使用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; }
}
答案 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类,并且不需要复制构造函数。