使用c#显示分层显示的递归函数

时间:2011-10-20 15:17:56

标签: c# sql sql-server-2008

我有一张这样的桌子

ID               Title                    Parentid
1                Level1                    0
2                Level2                    1
3                Level3                    2 
4                Level4                    1

我希望根据parentid,Id关系输出层次结构模型

  • 级别1
  • - > Level2-> Level 3
  • - >级别4。

我能够实现像

                      level1
                        /\
                  level2  level4. 

这里我没有达到3级。 但是我想要使用c#在第一个例子中显示的ouptut。

3 个答案:

答案 0 :(得分:1)

(未经测试)尝试:

;with RCTE as
(select id, title full_path from MyTable where ParentID = 0
 union all
 select m.id, r.full_path & '->' & m.title full_path
 from MyTable m, RCTE r
 where m.parentid = r.id)
select full_path from RCTE

答案 1 :(得分:0)

所有父母都是在孩子面前定义的吗?

如果是这样,你可以使用字典(int,List(Item))(对不起括号,似乎无法让尖括号工作),比如说,

public class Item {
    public int Id { get; set;}
    public int ParentId { get; set;}
    public string Title {get; set;}
}


IDictionary<int, List<Item>> CreateTree(IEnumerable<Item> nodeList){

    var ret = new Dictionary<int, List<Item>>();

    foreach (var item in items) {

            if (!ret.ContainsKey(item.ParentId)) {
                ret.Add(item.ParentId, new List<Item>());
            }
            ret[item.ParentId].Add(item);
        }

    return ret;
}

这将给出(对于上述数据)

0 =&gt;级别1

1 =&gt; level2,level4

2 =&gt;级别3

如果父ID不能保证在子ID之前,那么你需要添加一些调整以允许孤儿,然后添加然后在最后处理它们。

希望这有帮助,

艾伦。

答案 2 :(得分:0)

递归应该使用公用表表达式查询(CTE)在SQL Server内部完成。一个查询应该能够给出结果和“级别”,然后可以在C#中解析,而无需在代码中进行递归。

这是一个带例子的链接:(马克的例子也适用)

http://msdn.microsoft.com/en-us/library/ms186243.aspx