0

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

0

1 Answer 1

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.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.