假设我们有一个具有以下属性的实体:
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public int? ParentId { get; set; }
}
子项是任何具有非null ParentId的Foo。可以有多个级别的父/子关系,此时最多可达5个。
是否有一种简单的LINQ方式或一般方法可以从Foo开始,让它的所有孩子及其孩子的孩子,以及它的孩子&#39 ;孩子等?
目前,我循环开始父母的每个孩子,然后再次循环以获得所有孩子的孩子等。这很乏味且看起来不正确实现我想要的方式。
答案 0 :(得分:1)
我更喜欢维护一个表示层次结构中某个位置的字符串属性。例如,如果值为“/ 99/42”,那么您知道该项属于父42,属于99.这很好的原因是因为您可以展平整个Foos集合并只查询该字段以“/ 99”开头的那些,你将获得层次结构的整个分支。所以你的课程看起来像这样:
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public string Path { get; set; } //eg: /99/42
}
希望有所帮助。
答案 1 :(得分:1)
因此,如果 all 你拥有的是一个Foo
个对象,那么你就无法获得所有它的后代。至少,您需要有一系列所有 Foo
个对象,以便找到将该对象作为父对象的节点,因为您的{{1对象尚未引用它的子对象。如果你做有那个序列,那就不是特别难了。
您可以对所有foos的序列使用Foo
来为该ID值的所有子项创建ID查找:
ToLookup
要获取特定孩子的所有后代序列,您现在可以进行简单的树遍历:
var allFoos = new List<Foo>();
var childrenLookup = allFoos.ToLookup(foo => foo.ParentId);