Linq, чтобы получить список моделей для Make to DTO - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть класс DTO, подобный этому

public string Make { get; set; };
public List<string> Models { get; set; }

Затем есть таблица, которая содержит список транспортных средств со столбцами марок и моделей.

Моя конечная точка API принимает список Строки (Makes)

Мне нужно возвращать список класса DTO для каждой марки и список моделей.

public async Task<ActionResult<List<MakeModelDTO>>> GetModelsByMakes([FromQuery] List<string> make_list)
{
return await _context.Vehicles.Where(x => x.Make.????).Select(x => x.Model).Distinct().ToListAsync();
}

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

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Как подсказал @Fabio, вы можете отфильтровать марку таким образом. Добавив к нему конвертирование в ваш DTO, вам нужно сгруппировать по ним.

Вы можете попробовать что-то вроде этого

public async Task<ActionResult<List<MakeModelDTO>>> GetModelsByMakes([FromQuery] List<string> make_list)
{
       var resultAsDto = await _context.Vehicles
                        .Where(vehicle => makeList.Contains(vehicle.Make))
                        .GroupBy(v=>v.Make)
                        .Select(g=> new YourDto
                         {
                             Make= g.Key -- As it grouped by make
                             Models = g.Select(v=>v.Model)
                         }).ToListAsync()
        return resultAsDto 
}
1 голос
/ 13 февраля 2020

Во-первых, В состоянии вы можете сделать это

Where(x => make_list.Contains(x.Make)

или

Where(x => make_list.Any(m => m == x.Make)

Во-вторых, метод возвращает List<MakeModelDTO>, Поэтому вы должны настроить результат выбора, как показано ниже

.GroupBy(p => p.Make).Select(g => 
               new MakeModelDTO { Make = g.Key,  Models = g.Select(p => p.Model).ToList() }).ToListAsync();

FullCode

public async Task<ActionResult<List<MakeModelDTO>>> GetModelsByMakes([FromQuery] List<string> make_list)
{
     return await _context.Vehicles.Where(x => make_list.Contains(x.Make)).GroupBy(p => p.Make).Select(g => 
               new MakeModelDTO { Make = g.Key,  Models = g.Select(p => p.Model).ToList() }).ToListAsync();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...