Linq通过层次结构进行递归

Dav*_*idB 1 c# linq linq-to-entities

我有一个heirarchical数据结构如下.

表格1

id | Groupname | parentId
Run Code Online (Sandbox Code Playgroud)

表2

id | nodeName | parentId
Run Code Online (Sandbox Code Playgroud)

表1 parentId引用table1 Id,table2 parentId也引用table 1 id.

从表1中的任何ID开始,我需要打印出所有节点,然后遍历所有子组的子节点.

到目前为止,我有这个

int id = 1; // replace with argument

repository.Nodes.Where(n => n.ParentId == Id).ToList().ForEach(d =>
{
  result.NodeList.Add(GetNodeDetails(n.Id));
});
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助我以良好的效率linq方式循环吗?

Dan*_*rth 5

如果我正确理解你想要展平层次结构,即最终结果应该是一个包含所有层次结构级别所有子级的平面列表.

实现这一目标的最简单方法是通过递归:

private IEnumerable<Node> GetSelfAndChildren(Node node)
{
    yield return GetNodeDetails(n.Id);
    foreach(var c in n.Children.SelectMany(GetSelfAndChildren)
        yield return c;
};


var result = repository.Nodes.Where(n => n.ParentId == Id)
                       .AsEnumerable()
                       .SelectMany(GetSelfAndChildren)
                       .ToList();
Run Code Online (Sandbox Code Playgroud)

这使用递归方法获得一个平面的子列表.

这种方法有可能表现出N + 1问题.根据配置的不同,每次访问Children都会导致数据库往返.
如果N + 1问题正在发生并导致 - 问题 - 另一种方法是首先从数据库中获取所有节点,然后执行广度优先搜索.