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

目标:返回一个由parentchildren组成的对象给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 -&gt; Child1 -&gt; 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 查询中包含空单元格

如何进行 sql 查询来构建树? [复制]

C# 构建动态树

从原始 SQL 到 Laravel Eloquent 或查询构建器

递归构建分层JSON树?