1

我有一个层次结构的数据结构如下。

表格1

id | Groupname | parentId

表 2

id | nodeName | parentId

表1的parentId指的是表1的id,表2的parentId也指的是表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));
});

任何人都可以帮助我以高效的 linq 方式进行循环吗?

4

1 回答 1

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();

这使用递归方法来获取子级的平面列表。

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

于 2013-04-23T07:36:00.253 回答