在c#应用程序中显示自引用表的数据

时间:2016-10-28 07:38:34

标签: c# ado.net

我有以下表格:

---------------------
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

来做

2 个答案:

答案 0 :(得分: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);
            }

        }

上面的代码执行了我需要的递归(你不需要删除的代码),并根据数据表中的数据在页面上构建树视图。

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

答案 1 :(得分: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