Recursive mapping in ASP.NET Core API - Tree Structure

笑着哭i 提交于 2020-06-01 05:33:45

问题


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: [],
      }
    ],
  },
];

To do this I created a Api endpoint:

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

            return Ok(tree);
        }

_treeService method:

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

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

Here is the mapping:

CreateMap<Node, NodeModel>();

Node is mapping to NodeModel:

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

And Node Entity:

    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>();
        }
    }

But in the result I receive:

[
    {
        "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: sorry for my English


回答1:


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

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.



来源:https://stackoverflow.com/questions/61986397/recursive-mapping-in-asp-net-core-api-tree-structure

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!