2016-10-28 3 views
0

私はテーブルを次ていますAC#アプリケーションに自己参照テーブルのデータを表示する

--------------------- 
Id Title Parent 
--------------------- 
1  Parent NULL 
2  Level_1 1 
3  Level_2 1 
4  Level_3 1 
5  Level  NULL 
6  Level_New 5 

は今、私は再帰関数が、行う方法がないアイデアを必要と知って、私のコンソールアプリケーションでは、これらのデータを表示したいですそれは私がADO.NETを使用して、これらのデータを読みたいbecuaseないEntityFramework.In EF私は子供のためのナビゲーションプロパティを持つモデルを定義することができます。

public class Menu 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public int? Parent { get; set; } 
    public ICollection<Menu> Children { get; set; } 
} 

しかし、問題は、私はEFを使用したくないということです。私は、それは再帰が楽しいではありません

+0

自己結合クエリを使用 –

+0

あなたはどのRDBMSを使用していますか? –

+0

@NiyokoYuliawan SQL Server – user3578852

答えて

0

が、これは私がはるかに大きい再帰

public class MyObject 
{ 

    public string Id; 
    public string ParentId; 
    public string Name; 
    public string Comments; 

} 

あなたは文句を言わない必要がある。このコードの多くをテストするために使用される溶液である生のADO.NETを使用してやりたいですしかし、これは再帰を必要としている必要があります。

private void BindTree(IEnumerable<MyObject> list, TreeNode parentNode, string previousNode) 
     { 
      var myObjects = list as IList<MyObject> ?? list.ToList(); 
      var nodes = myObjects.Where(x => (parentNode == null ? x.ParentId == "[].[].[(root)]" : x.ParentId == parentNode.Value)); 

      var listOfNodeNames = new List<string>(); 

      foreach (var node in nodes) 
      { 


       var newNode = new TreeNode(node.Name, node.Id); 



       BindTree(myObjects, newNode, previousNode); 
      } 

     } 

上記のコードは、私が必要とする再帰(あなたは文句を言わない取り除か必要なコード)を行い、データテーブルからのデータに基づいて、ページ上のツリービューを構築します。

しかし、これは再帰を行う必要があります。

0

まずサーバーからデータを取り出し、クライアント側でツリーを構築する必要があります。循環参照に注意してください。

まず、Childrenます決してnull

public class Menu 
{ 
    public Menu() 
    { 
     Children = new HashSet<Menu>(); 
    } 

    public int Id { get; set; } 
    public string Title { get; set; } 
    public int? Parent { get; set; } 
    public ICollection<Menu> Children { get; private set; } 
} 

は、あなたがこの

ようなデータを取得する

var connBuilder = new SqlConnectionStringBuilder(); 
connBuilder.DataSource = "localhost"; 
connBuilder.InitialCatalog = "YourDatabaseName"; 
connBuilder.IntegratedSecurity = true; 

using (var con = new SqlConnection(connBuilder.ToString())) 
{ 
    con.Open(); 

    var list = new List<Menu>();     
    //pull data from database    
    using (var cmd = con.CreateCommand()) 
    { 
     cmd.CommandText = "SELECT Id, Title, Parent FROM [dbo].[YourTableName]"; 
     using (var reader = cmd.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       list.Add(new Menu 
       { 
        Id = reader.GetInt32(0), 
        Title = reader.GetString(1), 
        Parent = reader.IsDBNull(2) ?(int?) null : reader.GetInt32(2) 
       }); 
      } 
     } 
    } 

    //construct tree 
    var newList = new List<Menu>(); 
    foreach (var l1 in list) 
    { 
     if (l1.Parent == null) 
     { 
      newList.Add(l1); 
     } 

     foreach (var l2 in list) 
     { 
      if (l2.Parent == l1.Id) 
      { 
       l1.Children.Add(l2); 
      } 
     } 
    } 

    // do whatever you want with newList 
} 

をデータベースからデータを取得し、ツリーを構築することを確認してくださいMenuクラスを変更

enter image description here