来自sql db的C#构建父子树

时间:2017-11-08 16:06:31

标签: c# json asp.net-mvc-4 entity-framework-6

我需要使用parentChildASP.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 -> Child1 -> Child2 of Child1...的层次结构?

非常感谢

1 个答案:

答案 0 :(得分:0)

尝试这样的事情

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