2013-04-05 5 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(); 
} 

Что она делает это получает только первый узел таблицы А, но узел все данные. Когда я нажимаю на узел, метод снова запускается, создавая тот же узел.

Я понятия не имею, почему у меня возникает эта проблема, если вы, ребята, поможете мне, это будет большой помощью, поскольку я застрял здесь в течение длительного периода времени.

Спасибо

+0

Что такое «Модель»? Показывать, где вы называете 'BuildHierarchy'? –

+0

Модель предназначена для хранения данных, в которых хранятся данные из базы данных. BuildHierarchy вызывается после заполнения модели, и над кодом предполагается создать узел и его примечание – shunilkarki

+0

Это был призыв добавить код к вашему сообщению. Непонятно, как вы называете «BuildHierarchy» и где идет выход. Кроме того, где класс 'A' и' B' в вашем коде? –

ответ

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 }; 
Смежные вопросы