Conversión de datos jerárquicos planos de SQL Server en un objeto JSON estructurado con C # / Linq

Estoy desarrollando una aplicación MVC que recupera datos de una tabla en SQL Server estructurada de la siguiente manera:

+-----------------------------------+ | Id | Name | Hierarchy | Depth | |-----------------------------------| | 01 | Justin | / | 0 | | 02 | Chris | /1 | 1 | | 03 | Beth | /1/1 | 2 | +-----------------------------------+ 

Los datos de ejemplo en la columna de Hierarchy son la representación de cadena del tipo de datos hierarchyid y la columna de Depth se calcula utilizando el método hierarchyid::GetLevel() .

Utilizando Entity Framework 4.1, he asignado la tabla anterior a esta clase:

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

Deseo utilizar esta información para mostrar una representación gráfica de la jerarquía al usuario utilizando JS Visualizations Toolkit , que requiere que los datos se estructuren:

 var node = { id: 1, name: 'Justin' children: [{ id: 2, name: 'Chris', children: [{ id: 3, name: 'Beth', children: [] }] }] } 

Tengo problemas para desarrollar la lógica para convertir una lista de mis modelos en un objeto JSON estructurado. ¿Alguna sugerencia?

EDITAR: No tengo tiempo para corregir la respuesta a continuación en este momento, pero dada la información adicional en la pregunta, sospecho que desea mantener un Dictionary lugar de una List para que esté no confiando en ningún pedido …


Para empezar, me olvidaría de la representación JSON y me concentraré en construir una representación POCO en memoria de la jerarquía. Para hacer eso, usaría algo como esto:

 class HierarchicalNode { private readonly List children = new List(); public List 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; } } 

Luego crea el árbol así:

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