[英]Entity Framework: Collection of ComplexType
是否可以使用实体框架来获取复杂类型的集合? 这是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来使用Complex Type,但是后来我仍然分别获得每一行。
我希望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"
}
]
}]
感谢帮助!
编辑:从不同方面相同的情况:如果我在db中有类似的内容怎么办:
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。 结果应该仍然是可查询的。
一种选择是使用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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.