据我所知你不能申请Include
在单个数据库查询中的多个子类型。您可以查询一种类型(OfType<Apple>().Include(a => a.AppelFruitness)
)对于另一个子类型也是如此。问题是您无法在同一查询中连接结果,因为结果集合具有不同的通用类型(苹果和橙子)。
一种选择是运行两个查询并将结果集合复制到基本类型的新集合中 - 正如您在问题下的评论部分中已经指出的那样。
另一个选项(只需要一个查询)是投影。您必须定义一个投影类型(您也可以投影到匿名类型)...
public class FruitViewModel
{
public FruitBase Fruit { get; set; }
public FruitnessFactor Factor { get; set; }
}
...然后可以使用查询:
List<FruitViewModel> fruitViewModels = context.FruitEntities
.OfType<Apple>()
.Select(a => new FruitViewModel
{
Fruit = a,
Factor = a.AppleFruitness
})
.Concat(context.FruitEntities
.OfType<Orange>()
.Select(o => new FruitViewModel
{
Fruit = o,
Factor = o.OrangeFruitness
}))
.ToList();
如果您不禁用更改跟踪(通过使用AsNoTracking
)当实体附加到上下文(“关系修复”)时,导航属性会自动填充,这意味着您可以从 viewModel 集合中提取水果...
IEnumerable<FruitBase> fruits = fruitViewModels.Select(fv => fv.Fruit);
...你会得到水果包括 the FruitnessFactor
特性。
这段代码非常尴尬,但多次要求不使用投影的直接方法但没有成功:
- 使用实体框架继承的瓶颈 https://stackoverflow.com/questions/6586574/bottleneck-using-entity-framework-inheritance
- 实体框架 - 子类相关对象的热切加载 https://stackoverflow.com/questions/7635152/entity-framework-eager-loading-of-subclass-related-objects
- 如何深度加载一个引用持久基类型实例的实体(实体框架 4) https://stackoverflow.com/questions/7203303/how-do-i-deeply-eager-load-an-entity-with-a-reference-to-an-instance-of-a-persis