C# 将层次结构循环到根目录
我需要将层次结构循环到根。 这是我的表列C# 将层次结构循环到根目录,c#,linq,sql-server-2008,C#,Linq,Sql Server 2008,我需要将层次结构循环到根。 这是我的表列 身份证 父ID 描述 我想你理解这个问题。ParentId为NULL的项是根 范例 Id=1 ParentId=NULL Descripion=Root Id=2 ParentId=1 Descripion=Id1的子项 这可以用linq实现吗?或者更好的sql查询。在sql Server上类似这样的解决方案可能是: 4示例如果我们想递归地找到Child1的根,我们可以使用 WITH n(ID, Description) AS (SELECT
- Id=1 ParentId=NULL Descripion=Root
- Id=2 ParentId=1 Descripion=Id1的子项
这可以用linq实现吗?或者更好的sql查询。在sql Server上类似这样的解决方案可能是:
4示例如果我们想递归地找到Child1的根,我们可以使用
WITH n(ID, Description) AS
(SELECT ID, Description
FROM yourTable
WHERE Description = 'Child1'
UNION ALL
SELECT nplus1.ID, nplus1.Description
FROM youTable as nplus1, n
WHERE n.ID = nplus1.ParentID)
SELECT name FROM n
看一看关键字为Oracle server上将使用相同的解决方案
SELECT Description
FROM yourTable
START WITH name = 'Child1'
CONNECT BY PRIOR ID = ParentID
如果可以更改(反转)树结构以使节点包含其子节点而不是引用其父节点,如下所示:
class Node
{
public Guid Id { get; set; }
public IEnumerable<Node> Children { get; set; }
public string Description { get; set; }
}
public static IEnumerable<T> FlattenedTree<T>(this T node, Func<T, IEnumerable<T>> getter)
{
yield return node;
var children = getter(node);
if(children != null)
{
foreach (T child in children)
{
foreach (T relative in FlattenedTree(child, getter))
{
yield return relative;
}
}
}
}
var descriptions = MyTreeStructure.FlattenedTree(x => x.Children).Select(x => x.Description);
您是说要返回特定项的整个层次结构吗?