Преобразование сведенных иерархических данных из SQL Server в структурированный объект JSON с помощью C # / Linq - PullRequest
3 голосов
/ 04 августа 2011

Я разрабатываю приложение MVC, которое извлекает данные из таблицы в SQL Server, которая структурирована следующим образом:

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

Пример данных в столбце Hierarchy является строковым представлением hierarchyid datatype, и столбец 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.Есть предложения?

1 Ответ

6 голосов
/ 04 августа 2011

РЕДАКТИРОВАТЬ: У меня нет времени, чтобы исправить ответ ниже прямо сейчас, но, учитывая дополнительную информацию в вопросе, я подозреваю, что вы хотите сохранить 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...