gpt4 book ai didi

c# - Entity Framework : Can I Include() properties of subtypes?

转载 作者:太空狗 更新时间:2023-10-29 19:45:02 24 4
gpt4 key购买 nike

我在我的 EF 项目中设置了一个 TPT 继承,其中包含一个父类(super class)型和两个子类型。我想获取父类(super class)型的所有对象和 Include() 子类型的导航属性,为此效果(更改类名以防止混淆):

var thelist = DataContext.Fleets
.Include(x => x.Vehicles.Select(y => y.EngineData)) // Not specific to Car or Truck
.Include(x => x.Vehicles.OfType<Car>().Select(y => y.BultinEntertainmentSystemData)) // Only Cars have BultinEntertainmentSystemData
.ToList();

因此,如果车辆是汽车,我想获取所有车辆,包括内置娱乐系统的信息。我已经看到,如果我直接从 DbSet 开始,这是可行的,但这里我查看的是 Fleet 对象的集合属性。当我对集合属性使用带有 OfType() 调用的 Include() 调用时,我收到此异常消息作为回复:

The Include path expression must refer to a navigation property defined on the type. Use dotted paths for reference navigation properties and the Select operator for collection navigation properties.

是否可以在集合属性中包含子类型的属性?

最佳答案

您无法执行您正在尝试的操作,因为您正在编写的查询已“翻译”为 SQL。 SQL 中没有“OfType”方法,并且 OfType 未设置为对象的属性,因此会出现此错误。理想情况下,EF 会将其转换为仅从包含 Type Car 的表中获取数据,但事实并非如此。

如果您在父级上添加一个指示类型的属性,则可以使用该属性进行导航。

public class Vehicle
{
public string Type {get; set;} //you need the setter here for EF
}

public class Car : Vehicle
{
public Car()
{
Type = "Car";
}
}

DataContext.Fleets
.Include(x => x.Vehicles.Select(y => y.EngineData)) // Not specific to Car or Truck
.Include(x => x.Vehicles.Where(x => x.Type == "Car").Select(y => y.BultinEntertainmentSystemData)) // Only Cars have BultinEntertainmentSystemData
.ToList();

这只是我现在想到的,您可能需要对其进行完善。使用字符串来定义这样的东西可能并不理想,请尝试将其设为枚举等。

关于c# - Entity Framework : Can I Include() properties of subtypes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41105616/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com