ASP.NET Core API中的递归映射-树结构 [英] Recursive mapping in ASP.NET Core API - Tree Structure
问题描述
我正在制作树形结构.结果,我想得到这样的结构:
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屋!