2011-10-20 170 views
2

我有這樣的遞歸函數使用C#

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

根據parentId的層次結構模型輸出我想要一個表顯示hierarchial顯示,標識關係,

  • 1級
  • - > Level2-> Level 3
  • - > Level4。

我能夠做到像

     level1 
         /\ 
        level2 level4. 

在這裏,我沒有得到3級 但我想作爲ouptut使用C#中所示的第一個例子。

+0

什麼DB IST他(甲骨文)? – Yahia

+0

其mssql服務器 – sachin

+1

如果您正在使用支持遞歸CTE(如SQLServer)的RDBMS,則應該可以在SQL中執行此操作。 –

回答

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 
+0

謝謝馬克,讓我們試試並回復你。 – sachin

0

是否所有的父母子女之前定義的?

如果是這樣,你可以使用一個詞典(INT,列表(項目))(約括號遺憾,似乎無法得到尖括號工作),其中,比方說,

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 => 1級

1 =>級別2,級別4

2 => 3級

如果父標識符不能保證在子標識符之前,那麼你需要添加一些調整來允許孤兒,然後添加然後在最後處理它們。

希望這會有所幫助,

Alan。

0

遞歸應該使用公用表表達式查詢(CTE)在SQL Server內完成。一個查詢應該能夠給出結果和「級別」,然後可以在C#中進行解析,而無需在代碼中進行遞歸。

這裏是舉例鏈接:(Mark的例子也適用)

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