2013-04-05 306 views
1

我正在使用Linq創建樹層次結構,因爲我是新手,所以我面臨麻煩。我已經從其中我要創建層級兩個表和表如下使用Linq構建樹層次結構

表A

Id 
Name 
Description 

表B

Id of A (as foreign key) 
Name 

我需要像結構這個:

name(From table A) 
    |_name(from table B) 
    |_name (from table B) 
name(from table A) 

我有一個類定義爲

Public Class C 
    { 
     public class C(C item,IEnumerable<C> id,IEnumerable<C> data) 
      { 

       AId=item.AI; 
       BId=item.BId; 
       AName=item.Name; 
       Childeren=id; 
      } 

      public IEnumerable<C> Children{get;set} 
     } 

所有表的名稱必須顯示,即使它不具有節點

我曾經集團攜手獲得無論從表中的數據,現在我有問題代碼來選擇節點及其子節點。我的linq代碼如下:

private List<Model> BuildHierarchy(IEnumerable<Model> Hirs) 
{ 
    var families=Hirs.ToLookup(x => x.AId); 
    var topmost = families.First().Select(s => s); 
    Func<string, IList<Model>> children = null; 
    children = (parentId) => families[parentId] 
        .OrderBy(x => x.BId) 
        .Select(x => new Model(x, children(x.BId), Hirs)) 
        .OrderBy(o=> o.Bid).ToList(); 

    return topmost.Select(mod => new Model(mod, children(mod.BId), Hirs)).ToList(); 
} 

它所做的只是獲取表A的第一個節點,但節點中的所有數據。當我點擊節點時,該方法會再次被調用,從而創建相同的節點。

我不知道爲什麼我有這個問題,如果你們會幫助我,這將是一個很大的幫助,因爲我在這裏呆了很長一段時間。

謝謝

+0

什麼是'Model'?顯示你在哪裏調用'BuildHierarchy'? – 2013-04-05 07:35:26

+0

模型用於保存來自數據庫的數據所在的數據。 BuildHierarchy在模型填充後調用,上面的代碼應該創建節點及其子註釋 – shunilkarki 2013-04-05 09:22:19

+0

這是一個向您的帖子中添加代碼的調用。目前還不清楚你如何調用'BuildHierarchy'和輸出的位置。另外,代碼中的類「A」和「B」在哪裏? – 2013-04-05 10:05:36

回答

0

請試試這個。我會進行編輯並使其更清晰或更精確。

DataSet ds = new DataSet(); 

    DataTable dtPrimary = new DataTable(); 
    dtPrimary.Columns.Add("Id", typeof(int)); 
    dtPrimary.Columns.Add("Name", typeof(string)); 


    DataTable dtForeign = new DataTable(); 
    dtForeign.Columns.Add("Id", typeof(int)); 
    dtForeign.Columns.Add("Name",typeof(string)); 

    ds.Tables.Add(dtPrimary); 
    ds.Tables.Add(dtForeign); 
    DataRelation dr = new DataRelation("myRelation", dtPrimary.Columns["Id"], dtForeign.Columns["Id"]); 

    dtPrimary.Rows.Add(1, "Name1"); 
    dtPrimary.Rows.Add(2, "Name2"); 

    dtForeign.Rows.Add(1,"Child1OfName1"); 
    dtForeign.Rows.Add(1, "Child2OfName1"); 
    dtForeign.Rows.Add(2, "ChildOfName2"); 

    DataTable dtNew = new DataTable(); 
    dtNew.Columns.Add("Id"); 
    dtNew.Columns.Add("Name"); 

var items = 
    from row in dtPrimary.AsEnumerable() 
    let foreignRow = (
    from innerRow in dtForeign.AsEnumerable() 
    where innerRow.Field<int>("Id") == row.Field<int>("Id") 
    select innerRow) 
    select new { Parent = row.Field<string>("Name"), Children = foreignRow };