我有以下表格:
---------------------
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 :(得分: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
}
你会得到这样的数据