2013-04-05 225 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 };