ASP.NET Core API中的递归映射-树结构 [英] Recursive mapping in ASP.NET Core API - Tree Structure

查看:86
本文介绍了ASP.NET Core API中的递归映射-树结构的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作树形结构.结果,我想得到这样的结构:

I'm making a tree structure. As a result, I want to receive such a structure:

[
  {
    name: 'node1',
    subNodes: [
      {
        name: 'node1-1',
        subNodes: [],
      },
      {
        name: 'node1-2',
        subNodes: [],
      },
    ],
  },
  {
    name: 'node2',
    subNodes: [],
  },
  {
    name: 'node3',
    subNodes: [
      {
        name: 'node3-1',
        subNodes: [
          {
            name: 'node3-1-1',
            subNodes: [],
          },
          {
            name: 'node3-1-2',
            subNodes: [],
          },
        ],
      },
      {
        name: 'node3-2',
        subNodes: [],
      }
    ],
  },
];

为此,我创建了一个Api端点:

To do this I created a Api endpoint:

        [HttpGet]
        public async Task<IActionResult> GetTree()
        {
            var tree = await _treeService.GetTreeAsync();

            return Ok(tree);
        }

_treeService方法:

_treeService method:

        public async Task<IEnumerable<NodeModel>> GetTreeAsync()
        {
            var tree = await _context.Nodes.ToListAsync();

            return _mapper.Map<IEnumerable<NodeModel>>(tree);
        }

以下是映射:

CreateMap<Node, NodeModel>();

节点正在映射到NodeModel:

Node is mapping to NodeModel:

    public class NodeModel
    {
        public string Name { get; set; }
        public List<Node> SubNodes { get; set; }
    }

和节点实体:

    public class Node
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int NodeId { get; private set; }
        public string Name { get; set; }
        public int? ParentNodeId { get; set; }
        [ForeignKey("ParentNodeId")]
        public Node ParentNode { get; set; }
        public List<Node> SubNodes { get; set; }
        public List<Leaf> SubLeaves { get; set; }
        public Node()
        {
            SubNodes = new List<Node>();
            SubLeaves = new List<Leaf>();
        }
    }

但是结果是:

[
    {
        "name": "Node1",
        "subNodes": [
            {
                "nodeId": 18,
                "name": "Node1_SubNode1",
                "parentNodeId": 17,
                "parentNode": {
                    "nodeId": 17,
                    "name": "Node1",
                    "parentNodeId": null,
                    "parentNode": null,
                    "subNodes": [
                        {
                            "nodeId": 19,
                            "name": "Node1_SubNode2",
                            "parentNodeId": 17,
                            "subNodes": [],
                            "subLeaves": []
                        },
                        {
                            "nodeId": 20,
                            "name": "Node1_SubNode3",
                            "parentNodeId": 17,
                            "subNodes": [],
                            "subLeaves": []
                        }
                    ],
                    "subLeaves": []
                },
                "subNodes": [],
                "subLeaves": []
            },
            {
                "nodeId": 19,
                "name": "Node1_SubNode2",
                "parentNodeId": 17,
                "parentNode": {
                    "nodeId": 17,
                    "name": "Node1",
                    "parentNodeId": null,
                    "parentNode": null,
                    "subNodes": [
                        {
                            "nodeId": 18,
                            "name": "Node1_SubNode1",
                            "parentNodeId": 17,
                            "subNodes": [],
                            "subLeaves": []
                        },
                        {
                            "nodeId": 20,
                            "name": "Node1_SubNode3",
                            "parentNodeId": 17,
                            "subNodes": [],
                            "subLeaves": []
                        }
                    ],
                    "subLeaves": []
                },
                "subNodes": [],
                "subLeaves": []
            },
            {
                "nodeId": 20,
                "name": "Node1_SubNode3",
                "parentNodeId": 17,
                "parentNode": {
                    "nodeId": 17,
                    "name": "Node1",
                    "parentNodeId": null,
                    "parentNode": null,
                    "subNodes": [
                        {
                            "nodeId": 18,
                            "name": "Node1_SubNode1",
                            "parentNodeId": 17,
                            "subNodes": [],
                            "subLeaves": []
                        },
                        {
                            "nodeId": 19,
                            "name": "Node1_SubNode2",
                            "parentNodeId": 17,
                            "subNodes": [],
                            "subLeaves": []
                        }
                    ],
                    "subLeaves": []
                },
                "subNodes": [],
                "subLeaves": []
            }
        ]
    },
    {
        "name": "Node1_SubNode1",
        "subNodes": []
    },
    {
        "name": "Node1_SubNode2",
        "subNodes": []
    },
    {
        "name": "Node1_SubNode3",
        "subNodes": []
    }
]

我们可以看到,模型尚未完全映射,但最后在同一行上显示.我该如何解决?

As we can see, the model has not been completely mapped, but on finally the same rows are displayed. How can I fixed this?

PS:对不起,我的英语

PS: sorry for my English

推荐答案

我建议您为 NodeModel中的 SubNodes 属性使用 NodeModel 类型类.我的意思是

I would suggest you to have a NodeModel type for the SubNodes property within the NodeModel class. I mean

public class NodeModel {
    public string Name { get; set; }
    public List<NodeModel> SubNodes { get; set; } 
}

这样,您的模型类将仅具有那些应该与API使用者相关的属性.似乎正是您所需要的.

So that your model class will have only those properties which are supposed to be relevant for an API consumer. And it seems to be exactly what you need.

这篇关于ASP.NET Core API中的递归映射-树结构的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆