Entity Framework: Коллекция ComplexType - PullRequest
0 голосов
/ 27 июня 2018

Возможно ли использование Entity Framework для получения коллекции сложных типов? Вот пример результата запроса базы данных View:

ID | Name | CarBrand | CarModel

111 | John | Audi | A4 
222 | Andrew | BMW | X5     
222 | Andrew | Toyota | Aygo    
333 | Dani | Opel | Corsa    
333 | Dani | Volvo | C30

Я хотел бы, наконец, иметь модель ниже в C #:

public class Owner
{
[Key]
public int Id { get; set; }

public string Name { get; set; }

public ICollection<Car> Cars { get; set; }
}

[ComplexType]
public class Car
{
public string Brand { get; set; }

public string Model { get; set; }
}

Я знаю, что могу использовать сложный тип, называя Car_Brand и Car_Model, но тогда я по-прежнему получаю каждую строку отдельно.

Я бы хотел, чтобы Entity Framework использовал значение ключа и «объединял» строки с одинаковым Id в один и помещал их в коллекцию.

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

[
{
 "Id": 111,
 "Name": "John",
 "Cars":
 [
    {
    "Brand": "Audi",
    "Model": "A4" 
    }
 ]
},
{
 "Id": 222,
 "Name": "Andrew",
 "Cars":
 [
    {
    "Brand": "BMW",
    "Model": "X5" 
    },
    {
    "Brand": "Toyota",
    "Model": "Aygo" 
    }
 ]
},
{
 "Id": 333,
 "Name": "Dani",
 "Cars":
 [
    {
    "Brand": "Opel",
    "Model": "Corsa" 
    },
    {
    "Brand": "Volvo",
    "Model": "C30" 
    }
 ]
}]

Спасибо за помощь!

EDIT: Тот же случай с другой стороны: Что делать, если у меня есть что-то вроде этого в БД:

OwnerView (View)
- OwnerId
- Name
- some additional data from other tables...

OwnerCar (Table)
- OwnerId
- CarId

Car (Table)
- Id
- Brand
- Model

и я определил отношения как ниже:

[Table("OwnerView")]
public class Owner
{
[Key]
public int Id { get; set; }

public string Name { get; set; }

public virtual ICollection<OwnerCar> OwnerCars { get; set; }
}

public class OwnerCar {
[Key, Column(Order = 0)]
public int OwnerId { get; set; }
[Key, Column(Order = 1)]
public int CarId { get; set; }


public virtual Owner Owner { get; set; }
public virtual Car Car { get; set; }
}

public class Car
{
[Key]
public int Id { get; set; }

public string Brand { get; set; }

public string Model { get; set; }

public virtual ICollection<OwnerCar> OwnerCars { get; set; }  
}

Я хотел бы получить OwnerView с коллекцией его автомобилей внутри. Результат все еще должен быть Queryable.

1 Ответ

0 голосов
/ 27 июня 2018

Одним из вариантов будет использование оператора groupby, например

var result = from r in dataset 
    group r by new { r.Id, r.Name } into grouping
    select new Owner { 
        Id = grouping.Key.Id, 
        Name = grouping.Key.Name,
        Cars = grouping.Select(g => new Car { Brand = g.CarBrand, Model = g.CarModel }).ToList()
    };

В качестве альтернативы, если возможно изменить структуру вашей базы данных, вы сможете нормализовать записи и использовать навигационные свойства LINQ. Это, вероятно, потребует создания модели «Владельцы» и модели «Автомобили» в вашей базе данных. Тогда вы сможете сделать что-то действительно простое, как

var result = Owners.Include(o => o.Cars); 
...