Форматирование api JSON-ответа для добавления атрибутов в массив - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть следующий api-контроллер, который возвращает json-представление запроса, который вы видите здесь:

public async Task<ActionResult<IEnumerable<CarDto>>> GetCarData(Guid carID)
{
    var carData = await (from cl in _context.CarList
                         join tl in _context.transmissionList
                             on cl.CId equals tl.CId
                         join to in _context.transmissionOptions
                             on tl.TId equals to.TId
                         where cl.CId == carID
                         select new CarDto
                         {
                             CarId = cl.CarId,
                             TransmissionId = tl.TId,
                             OptionId = to.OptionId,
                             GearId = to.GearId
                         })
                         .ToListAsync();
    return carData;
}

Возвращенные данные json выглядят так:

[
    {
        "carId": "351a",
        "transmissionId": "ec7",
        "optionId": "a1",
        "gearId": "674532a"
    },
    {
        "carId": "351a",
        "transmissionId": "ec7",
        "optionId": "b7",
        "gearId": "5f9173f"
    },
    {
        "carId": "351a",
        "transmissionId": "ec7",
        "optionId": "c5",
        "gearId": "cf807"
    }
]

Однако яХотелось бы, чтобы он был отформатирован так, чтобы существовало свойство с именем transmissionChoices, содержащее массив возможных опций.

Вот так:

{
    "carId": "351a",
    "transmissionId": "ec7",
    "transmissionChoices": [
        {
            "optionId": "a1",
            "gearId": "674532a"
        },
        {
            "optionId": "b7",
            "gearId": "5f9173f"
        },
        {
            "optionId": "c5",
            "gearId": "cf807"
        }
    ]
}

Есть ли способ получитьконтроллер для его форматирования?

1 Ответ

1 голос
/ 07 ноября 2019

Вы можете использовать метод LINQ GroupBy, а затем проецировать сгруппированные результаты в нужную форму.

public async Task<ActionResult<IEnumerable<object>>> GetCarData(Guid carID)
{
    var carData = await (from cl in _context.CarList
                        join tl in _context.transmissionList
                            on cl.CId equals tl.CId
                        join to in _context.transmissionOptions
                            on tl.TId equals to.TId
                        where cl.CId == carID
                        select new
                        {
                            CarId = cl.CarId,
                            TransmissionId = tl.TId,
                            OptionId = to.OptionId,
                            GearId = to.GearId
                        })
                        .GroupBy(x => x.CarId)
                        .Select(g => new
                        {
                            CarId = g.First().CarId,
                            TransmissionId = g.First().TransmissionId,
                            TransmissionChoices = g.Select(x => new
                            {
                                OptionId = x.OptionId,
                                GearId = x.GearId
                            })
                        })
                        .ToListAsync();
    return carData;
}

Обратите внимание, что это проецирование результатов в анонимный тип. Не стесняйтесь создавать модель, которая соответствует нужной вам схеме, а затем использовать эту модель в проекции Select(...).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...