【问题标题】:C# from sql db build a parent child treeC# 从 sql db 构建父子树
【发布时间】: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... 的层次结构?

非常感谢

【问题讨论】:

  • 当它是父级时,使用递归循环遍历父级的子级。
  • 在第二个其他?可以给我一些想法吗?
  • 图表只有一个头吗?
  • 是的,只有一个头

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


【解决方案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 列表。
猜你喜欢
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多