Создайте иерархическую структуру ответов JSON Http, используя LinQ - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь получить вложенный иерархический ответ JSON от ASP.NET webAPI, где определена плоская модель на основе таблицы SQL.

Я новичок в ASP.NET WebAPI. У меня есть проект MVC ASP.NET, где определен класс модели сборки. Каждая сборка может быть дочерней по отношению к другой сборке с теоретически бесконечными детьми и детьми.

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

Int Id
String Name
Int ParentId

Мне нужно выполнить Http GET, чтобы получить иерархическую структуру родитель-потомок.

Теперь у меня есть следующая функция в классе контроллера сборки:

[Route("api/Assembly/GetTree/{id}")]
[HttpGet]
public IEnumerable<Assembly> GetTree(int id)
{
    var assemblies = db.Assemblies.Where(x => x.ParentId == id || x.Id == id).ToList();
    var child = assemblies.AsEnumerable().Union(db.Assemblies.AsEnumerable().Where(x => x.ParentId == id).SelectMany(y => GetParent(y.Id))).ToList();

    return child;
}

Проблема (я думаю) в том, что «союз» возвращает мне плоский ответ JSON.

db.Assembies является экземпляром сборки класса контекстной модели db, автоматически сгенерированной из db и определенной следующим образом:

public partial class Assembly
    {
        public Assembly(){}

        public int Id { get; set; }
        public string Name { get; set; }
        public int ParentId { get; set; }
    }

Ожидаемый результат должен быть таким:

[
    {
        Id: '1',
        Name: 'Assembly1',
        ParentId: '0'
        children: [
            {
                Id: '2',
                Name: 'Assembly1.1',
                ParentId: '1',
            },
            {
                Id: '3',
                Name: 'Assembly1.2',
                ParentId: '1',
            },
        ]
      }, 
      {
        Id: '4',
        Name: 'Assembly2',
        ParentId: '0'
        children: [
            {
                Id: '5',
                Name: 'Assembly2.1',
                ParentId: '4',
                children: [
                    {
                        Id: '6',
                        Name: 'Assembly2.1.1',
                        ParentId: '5',
                    },
                    {
                        Id: '7',
                        Name: 'Assembly2.1.2',
                        ParentId: '5',
                    },
                ]
            },  
            {
                Id: '8',
                Name: 'Assembly2.2',
                ParentId: '4'
                children: [
                    {
                        Id: '9',
                        Name: 'Assembly2.2.1',
                        ParentId: '8',
                    },
                    {
                        Id: '10',
                        Name: 'Assembly2.2.2',
                        ParentId: '8',
                    },
                ]
            },
        ]
    },
]

Как я могу поместить сборки друг в друга?

1 Ответ

0 голосов
/ 10 мая 2019

Я думаю, что главная проблема в том, что дочерние элементы не видны из родительского узла. Так что сериализация родителя, просто даст родительский узел. Однако, если родительский объект хранит все дочерние элементы, то логика сериализации сможет выполнить все зависимые данные и дать вам нужную вложенную иерархию.

Что-то похожее на это:

void Main()
{
    var grandChild1 = new Node() { Name = "GrandChild1" };  
    var child1 = new Node() { Name = "Child1", Children = new List<Node> {grandChild1} };
    var child2 = new Node() { Name = "Child2" };    
    var root = new Node() { Name = "Root", Children = new List<Node> {child1, child2} };

    var serialized = JsonConvert.SerializeObject(root);

    Console.WriteLine(serialized);
}

public class Node
{
    public string Name { get; set; }    
    public List<Node> Children { get; set; }
}

Это даст следующий вывод:

{
    "Name": "Root",
    "Children": [{
            "Name": "Child1",
            "Children": [{
                    "Name": "GrandChild1",
                    "Children": null
                }
            ]
        }, {
            "Name": "Child2",
            "Children": null
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...