C# 从 sql db 构建父子树
Posted
技术标签:
【中文标题】C# 从 sql db 构建父子树【英文标题】:C# from sql db build a parent child tree 【发布时间】:2018-04-21 09:59:16 【问题描述】:我需要一些带有parentChild
对象的输入,使用ASP.NET C# + Entity Framework
。
目标:返回一个由parent
和children
组成的对象给ASP.NET View
我的班级(数据库表):
public class Organo
[Key]
public int id get; set;
public int key get; set;
public int parent get; set;
public string name get; set;
public string text get; set;
[NotMapped]
public List<Organo> OrganoChildrens get; set;
数据示例:
id | key | parent | name | text
----+-------+----------+--------+----------
1 1 0 A A
2 2 1 B B
3 3 1 C C
4 4 2 B1 B1
5 5 4 B1_1 B1_1
6 6 1 D D
我的控制器:
public async Task<ActionResult> index()
//get all data
var organos = await db.Organos.ToListAsync();
Organo organo_ = new Organo();
foreach (var item in organos)
//head of diagram
if(item.parent == 0)
organo_.id = item.id;
organo_.key = item.key;
organo_.parent = 0;
organo_.name = item.name;
organo_.text = item.text;
else
//child
Organo organoChild_ = new Organo();
organoChild_.id = item.id;
organoChild_.key = item.key;
organoChild_.parent = item.parent;
organoChild_.name = item.name;
organoChild_.text = item.text;
organo_.OrganoChildrens.Add(organoChild_);
return View(fishbone_);
但是这样我只能得到第一级的孩子。
我如何构建Parent -> Child1 -> Child2 of Child1...
的层次结构?
非常感谢
【问题讨论】:
当它是父级时,使用递归循环遍历父级的子级。 在第二个其他?可以给我一些想法吗? 图表只有一个头吗? 是的,只有一个头 【参考方案1】:试试这样的
public async Task<ActionResult> index()
//get all data
var organos = await db.Organos.ToListAsync();
var populatedOrgano = PopulateChildren(organos.Single(x => x.parent == 0));
return View(populatedOrgano);
public Organo PopulateChildren(Organo sourceOrgano, ICollection<Organo> organos)
Organo organo_ = new Organo();
var children = organos.Where(x => x.parent == sourceOrgano.id);
foreach (var child in children)
//child
Organo organoChild_ = new Organo();
organoChild_.id = child.id;
organoChild_.key = child.key;
organoChild_.parent = child.parent;
organoChild_.name = child.name;
organoChild_.text = child.text;
organo_.OrganoChildrens = new List<Organo>();
organo_.OrganoChildrens.Add(organoChild_);
PopulateChildren(child, organos);
return organo_;
【讨论】:
我还没有测试过这个,新的 Organos 可能会有些奇怪,但它应该足以让你开始。 我在这里遇到错误:organo_.OrganoChildrens.Add(organoChild_); > 对象引用未设置为对象的实例。 查看我的编辑,您只需在添加之前更新 OrganoChildrens 列表。以上是关于C# 从 sql db 构建父子树的主要内容,如果未能解决你的问题,请参考以下文章
如何避免从 C# 构建的 Sql Server 2005 参数化查询变慢
在 C# 代码中的 DB 中的 Linq 查询中包含空单元格