Conversione di dati gerarchici appiattiti da SQL Server in un object JSON strutturato con C # / Linq

Sto sviluppando un’applicazione MVC che recupera i dati da una tabella in SQL Server strutturata in questo modo:

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

I dati di esempio nella colonna Hierarchy sono la rappresentazione della stringa del tipo di dati hierarchyid e la colonna Depth viene calcasting utilizzando il metodo hierarchyid::GetLevel() .

Utilizzando Entity Framework 4.1, ho mappato la tabella sopra a questa class:

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

Voglio utilizzare queste informazioni per visualizzare una rappresentazione grafica della gerarchia all’utente utilizzando il toolkit di visualizzazione JS , che richiede la strutturazione dei dati:

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

Ho difficoltà a sviluppare la logica per convertire un elenco dei miei modelli in un object JSON strutturato. Eventuali suggerimenti?

EDIT: Non ho il tempo di aggiustare la risposta qui sotto, ma date le informazioni extra nella domanda, sospetto che tu voglia mantenere un Dictionary piuttosto che una List modo che tu sia non fare affidamento su alcun ordine …


Vorrei dimenticare la rappresentazione JSON per iniziare e concentrarmi sulla costruzione di una rappresentazione POCO in memoria della gerarchia. Per farlo, userei qualcosa del genere:

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

Quindi costruisci l’albero in questo modo:

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