我认为这里有类似的帖子,但不完全一样......
我的EF模型中有两个实体 - 让我们称之为Person和Developer,后者继承自前者。
我在开发人员中也有一个名为Qualifications的协会。这在Person实体上不可见。
如果我正在针对上下文编写查询,我该如何自动.Include()开发人员的资格,例如
来自上下文员工的。员工 。包括(“资格”) 选择员工
不起作用...... EF抱怨这种关系不存在(我假设它在Employee上不存在 - 但在上下文中没有Developer实体,只有Employee)。
答案 0 :(得分:11)
我遇到过这个问题并进行了一些实验。以下是我发现使用LINQ 2实体工作的内容。
假设我们在您的示例中有人< - Developer ---- Qualifications。
如果您想选择包含资格的开发者,您可以这样做。
var dev = (from d in context.Persons.OfType<Developer>
.Include("Qualifications")
where d.ID == id
select d).FirstOfDefault();
现在假设我们在Person和Address之间有另一个关联,我们也可以使用LINQ 2 Entity将地址包含在select中。
var dev = (from d in context.Persons
.Include("Address")
.OfType<Developer>()
.Include("Qualifications")
where d.ID == id
select d).FirstOfDefault();
注意我在转换Type之前我已经包含了所需的东西,并且在转换后再次包含了。两个包括现在应该没有任何问题地一起工作。我测试了这些方法,它们都有效。我希望他们能为你工作,因为你的继承设置正确。
GL
答案 1 :(得分:3)
这个怎么样:
var results = from developer in ctx.Employee.OfType<Developer>()
select new {developer, Qualifications = developer.Qualifications};
这里的事情很有趣:
如果你随后这样做:
var developers = from anon in developers.AsEnumerable()
select anon.Developer;
你只会得到开发者,他们也会加载他们的资格。
有关其工作原理的详细信息,请参阅Tip 1
希望这有帮助
亚历
答案 2 :(得分:3)
基于Tri Q的答案,但对于那些喜欢&#39; .Load()&#39;方法,您可以使用:
context.Persons.OfType<Developer>().Include(t => t.Qualifications).Load();
我在DbContext中使用它。我创建了LoadDb()方法,它加载了我需要的所有数据。所以我可以在许多项目中使用它。
答案 3 :(得分:0)
我不熟悉EF,但这看起来像标准的继承问题。如果要从“父”对象的集合(实际对象可能是或可能不是子类的实例)访问子类的唯一属性,则需要检查对象类型并将其强制转换为子对象在适当的情况下,您可以访问唯一的属性。
如果某些或所有对象都不是开发人员,那么您希望给定的语句返回什么?