如何在dotnet C#中将HierarchyId数据类型转换为子级/父级结构?

问题描述 投票:0回答:1

出于某种原因,例如性能,我必须在数据库中使用HiarachyId。我必须将HierarchyId数据类型转换为JSON才能显示在FancyTree中。

我使用解决方案here,但不起作用。我的代码是

static void Main(string[] args)
    {

        {

                        var dd = new List<Field>();
        dd.Add(new Field(1, "Earth", HierarchyId.Parse("/")));
        dd.Add(new Field(2, "Europe", HierarchyId.Parse("/1/")));
        dd.Add(new Field(3, "South America", HierarchyId.Parse("/2/")));
        dd.Add(new Field(4, "Antarctica", HierarchyId.Parse("/3/")));
        dd.Add(new Field(5, "Brazil", HierarchyId.Parse("/2/1/")));
        dd.Add(new Field(6, "France", HierarchyId.Parse("/1/1/")));
        dd.Add(new Field(7, "Germany", HierarchyId.Parse("/1/4/")));
        dd.Add(new Field(8, "test", HierarchyId.Parse("/1/5/")));
        dd.Add(new Field(9, "McMurdo Station", HierarchyId.Parse("/3/1/")));
        dd.Add(new Field(10, "Italy", HierarchyId.Parse("/1/3/")));
        dd.Add(new Field(11, "Spain", HierarchyId.Parse("/1/2/")));
        dd.Add(new Field(12, "Morano", HierarchyId.Parse("/1/3/1/")));
        dd.Add(new Field(13, "Rio de Janeiro", HierarchyId.Parse("/2/1/3/")));
        dd.Add(new Field(14, "Paris", HierarchyId.Parse("/1/1/1/")));
        dd.Add(new Field(15, "Madrid", HierarchyId.Parse("/1/2/1/")));
        dd.Add(new Field(16, "Brasilia", HierarchyId.Parse("/2/1/1/")));
        dd.Add(new Field(17, "Bahia", HierarchyId.Parse("/2/1/2/")));
        dd.Add(new Field(18, "Salvador", HierarchyId.Parse("/2/1/2/1/")));
        dd.Add(new Field(19, "tets1", HierarchyId.Parse("/2/1/3/1/")));
        dd.Add(new Field(20, "test2", HierarchyId.Parse("/2/1/3/1/1/")));
        dd.Add(new Field(21, "test3", HierarchyId.Parse("/2/1/3/1/1/1/")));
        dd.Add(new Field(22, "test24", HierarchyId.Parse("/2/1/3/1/1/2/")));

            MyClass clss = new MyClass();
            var x=  clss.NewMthodTest(dd);

        }

    }

生孩子的方法:

     public class MyClass
{
    public List<HierarchicalNode> NewMthodTest(List<Field> query)
    {

        var root = new HierarchicalNode("Root", 0);
        foreach (var rec in query)
        {
            var current = root;
            foreach (string part in rec.Node.ToString().Split(new[] { '/' },
                                           StringSplitOptions.RemoveEmptyEntries))
            {
                int parsedPart = int.Parse(part);
                current = current.Children[parsedPart - 1];
            }
            current.Children.Add(new HierarchicalNode(rec.FieldName, rec.Id));
        }
        return null; // in this method i don't know what do we suppose to return 
    }
}

并且我的输入参数类是:

    public class Field 
    {
        public Field(long id, string fieldName, HierarchyId node)
        {
            Id = id;
            FieldName = fieldName;
            Node = node;
        }
        public long Id { get; set; }
        public string FieldName { get; set; }
        public HierarchyId Node { get; set; }
    }

并且输出类是

    class HierarchicalNode
{
    private readonly List<HierarchicalNode> children =
        new List<HierarchicalNode>();
    public List<HierarchicalNode> Children { get { return children; } }

    private readonly string name;
    public string Name { get { return name; } }

    private readonly long id;
    public long Id { get { return id; } }

    public HierarchicalNode(string name, long id)
    {
        this.name = name;
        this.id = id;
    }
}

似乎有问题,它返回以下内容:enter image description here

c# asp.net .net-core hierarchyid
1个回答
0
投票

经过无数次的网上搜索后,我用c#中的递归方法自己解决了这个问题。

我将我的全部代码放在这里,以帮助以后搜索此问题的人。如果有人有任何好的建议可以使它更好,请留下便条,让我高兴。

这是我的代码:

这是我的主要方法,调用GetTreeMethod

  public List<TreeView> GetTree()
    {
       //get all nodes from DB to make a collection in RAM
        var nodesColect = _getFieldsList.GetFieldsByNode("/");

        var x = GetTreeMethod("/", nodesColect);

        return x;
    }

这是我的主要递归方法

private List<TreeView> GetTreeMethod(string nodeStr,List<FieldListDto> lstCollection)
    {
        List<TreeView> lst = new List<TreeView>();
        HierarchyId node = HierarchyId.Parse(nodeStr);
        var lastItemInCurrentLevel = GetChilds(node, lstCollection);

        foreach (var item in lastItemInCurrentLevel)
        {
            TreeView tr = new TreeView
            {
                title = item.title,
                id = item.id,
                node = item.node,
                fin = item.fin,
            };
            tr.children = GetTreeMethod(item.node.ToString(), lstCollection);
            lst.Add(tr);
        }

        return lst;
    }

这只是给特定节点的子节点

   private List<TreeView> GetChilds(HierarchyId node, List<FieldListDto> lstCollection)
    {
        List<TreeView> child = lstCollection.Where(x => x.Node.ToString() != "/" && x.Node.GetAncestor(1).ToString() == node.ToString()).Select(q => new TreeView { id = q.Id, node = q.Node, title = q.FieldName }).ToList();
        return child;

    }

型号

public class FieldListDto  
{
    public long id { get; set; }
    public string FieldName { get; set; }
    public HierarchyId Node { get; set; }
}
 public class TreeView
{
    public long id { get; set; }
    public string title { get; set; }
    public HierarchyId node { get; set; }
    public List<TreeView> children { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.