我希望SO社区的某个人能够帮助我。
简化背景: 我正在使用Entity Framework V1构建我的类结构,如下所述,我使用Table Per Type来持久保存我继承的对象:
Employee
CaseA : Case
CaseB : Case
CaseC : Case
CaseB拥有员工导航属性
我有一个返回ObjectQuery的Repository。如果Case的类型实际上是CaseB,我需要在图中包含Employee对象。我不能.Include(“Employee”),因为它不是Case的导航属性,而Employee上没有.Load()方法。
理想情况下,我希望能够在一个查询中执行此操作,但是作为后退,我很高兴我打电话,检查对象并执行另一个调用,如下所示:(尽管如前所述,员工导航属性中不存在负载)
//Get the case from the
Case myCase = new Repo<Case, Entities>.FirstOrDefault();
if(myCase is CaseB)
((CaseB)myCase).Employees.load();
我在这里错过了一些非常简单的东西吗?
答案 0 :(得分:3)
试试这个:
var employee = ctx.Cases
.OfType<CaseB>()
.Include("Employees")
.Select(x => x.Employees)
.FirstOrDefault();
在继承方面, OfType<T>()
是EF中最重要的方法之一 - 你应该熟悉它。
本质上是将查询中的项过滤为特定类型 - 非常类似于您在答案中执行的条件检查。
这是一个IQueryable
方法(LINQ-Objects),但是在LINQ-Entities(ObjectQuery<T>
)中,它被实现为INNER JOIN。
以上操作应该有效 - 只需确保在执行OfType
之后执行的急切加载。
HTH。
答案 1 :(得分:0)