Список дочерних элементов в операторе соединения - LINQ - PullRequest
1 голос
/ 24 апреля 2020

У меня есть 3 коллекции

            List<Brand> brands= new List<Brand>
            {
            new Brand { ID = 5, Name = "Toyota"},
            new Brand { ID = 6, Name = "Mazda"},
            new Brand { ID = 7, Name = "Seat"}
            };


            ModelParam par1 = new ModelParam() { Id = 1, fuelType = "Petrol", enginePower =110, engineTorque = 130 };
            ModelParam par2 = new ModelParam() { Id = 2, fuelType = "Petrol", enginePower = 170, engineTorque = 290 };
            ModelParam par3 = new ModelParam() { Id = 3, fuelType = "Diesel", enginePower = 140, engineTorque = 280 };
            ModelParam par4 = new ModelParam() { Id = 4, fuelType = "Diesel", enginePower = 190, engineTorque = 320 };

            List<Model> models = new List<Model>
            {
                new Model { Id = 1, Name = "CX5", brandId = 6, parameters = new List<ModelParam> {par1, par3} },
                new Model { Id = 2, Name = "Corolla", brandId = 5, parameters = new List<ModelParam> {par2, par3} },
                new Model { Id = 3, Name = "Leon", brandId = 7, parameters = new List<ModelParam> {par2, par4} }
            };

В результате я хочу получить запрос с комбинацией: Бренд - Модель - FuelType - EnginePower. Я написал это, чтобы объединить бренды и списки моделей:

var result = models.Join(brands, 
    mod => mod.brandId , 
    b => b.ID, 
    (mod, b) => new { b.Name, mod.Name })
.ToList();

Проблема в том, что я не могу извлечь fuelType и enginePower из ModelParams из свойства params в Списке моделей. Любые советы?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Может ли этот подход работать на вас?

var result = models.Join(
    brands,
    mod => mod.brandId,
    b => b.ID,
    (mod, b) => mod.parameters.Select(parameter => new { 
       Brand = b.Name,
       Model = mod.Name,
       FuelType = parameter.fuelType,
       EnginePower = parameter.enginePower 
    }))
       .SelectMany(pr => pr)
       .ToList();
1 голос
/ 24 апреля 2020

Вам следует немного обновить селектор результатов Func и получить необходимые значения fuelType и enginePower из коллекции parameters в классе Model. Следующий фрагмент выберет только первый fuelType из параметров и максимальный enginePower.

var result = models
    .Join(brands, mod => mod.brandId, b => b.ID,
    (mod, b) => new
    {
        Brand = b.Name,
        Model = mod.Name,
        FuelType = mod.parameters.Select(p => p.fuelType).FirstOrDefault(),
        EnginePower = mod.parameters.Max(p => p.enginePower)
    })
    .ToList();

Однако существует ситуация, когда модель может иметь несколько значений для fuelType и enginePower.

Если вам нужно выбрать все комбинации, просто просмотрите parameters собрать и затем сгладить результат, используя SelectMany

var result = models
    .Join(brands, mod => mod.brandId, b => b.ID,
    (mod, b) => mod.parameters.Select(p => new
    {
        Brand = b.Name,
        Model = mod.Name,
        FuelType = p.fuelType,
        EnginePower = p.enginePower
    }))
    .SelectMany(_ => _)
    .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...