我正在开发一个MVC应用程序,该应用程序从SQL Server中的表中检索数据,该表的结构如下:
+-----------------------------------+ | Id | Name | Hierarchy | Depth | |-----------------------------------| | 01 | Justin | / | 0 | | 02 | Chris | /1 | 1 | | 03 | Beth | /1/1 | 2 | +-----------------------------------+
Hierarchy列中的示例数据是hierarchyid数据类型的字符串表示形式,并且该Depth列是使用hierarchyid::GetLevel()方法计算的。
Hierarchy
hierarchyid
Depth
hierarchyid::GetLevel()
使用Entity Framework 4.1,我已将上表映射到此类:
public class Node { public int Id { get; set; } public string Name { get; set; } public string HierarchyPath { get; set; } // String representation of the hierarchyid public int Depth { get; set; } }
我想使用此信息通过JS Visualizations Toolkit向用户显示层次结构的图形表示,这需要对数据进行结构化:
var node = { id: 1, name: 'Justin' children: [{ id: 2, name: 'Chris', children: [{ id: 3, name: 'Beth', children: [] }] }] }
我在开发将模型列表转换为结构化JSON对象的逻辑时遇到了麻烦。有什么建议?
编辑:我现在没有时间修复下面的答案,但是鉴于问题中的其他信息,我怀疑您想保留a Dictionary<int, HierarchicalNode>而不是a,List<HierarchicalNode>以便您不依赖任何排序…
Dictionary<int, HierarchicalNode>
List<HierarchicalNode>
我会从一开始就忘记JSON表示,而将精力集中在构建层次结构的内存POCO表示中。为此,我将使用以下方法:
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 int id; public int Id { get { return id; } } public HierarchicalNode(string name, int id) { this.name = name; this.id = id; } }
然后像这样构建树:
// Make sure we get everything in a sensible order, parents before children var query = context.Nodes.OrderBy(x => x.Depth); var root = new HierarchicalNode("Root", 0); foreach (var node in query) { var current = root; foreach (string part = node.HierarchyPath.Split(new[] {'/'}, StringSplitOptions.RemoveEmptyEntries)) { int parsedPart = int.Parse(part); current = current.Children[parsedPart - 1]; } current.Children.Add(new HierarchicalNode(node.Name, node.Id)); }