2016-10-28 53 views
0

我有如下表:显示自引用表在C#应用程序数据

--------------------- 
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不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 。我想用原料ADO.NET它

+0

使用Self Join查询 –

+0

您使用的是什么RDBMS? –

+0

@NiyokoYuliawan SQL SERVER – user3578852

回答

0

递归是不好玩,这是我用来测试一个更大的递归

public class MyObject 
{ 

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

} 

很多这样的代码,你不会需要的解决方案做,但是这应该会让你想要递归。

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); 
      } 

     } 

上面的代码做我所需要的递归(代码你不会需要剥离出来),并建立了基于从数据表的数据页上的一个TreeView。

但是,这应该让你想要你需要做你的递归。

0

您需要首先从服务器获取数据,然后在客户端构建树。谨防循环引用。

首先,改变你的Menu类,以确保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 
} 

你会得到的数据是这样

enter image description here

相关问题