我有类似的课程:
Person
{
Name
Address
}
Employee : Person
{
Compensation - object
}
Visitor : Person
{
}
Run Code Online (Sandbox Code Playgroud)
如果我写linq:
var persons = Context.Persons
.Include("Compensation");
Run Code Online (Sandbox Code Playgroud)
我收到错误:
指定的包含路径无效.EntityType"Person"未声明名为"Compensation"的导航属性.
如果我这样做,它可以正常工作
var persons = Context.Persons
.OfType<Employee>()
.Include("Compensation");
Run Code Online (Sandbox Code Playgroud)
但我想让员工和访问者在同一个查询中.
看起来在EF4 UserVoice上有此功能的请求:http: //data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions/suggestions/1249289-include-property-of衍生类?REF =标题
但它看起来不会很快就会完成.
这个问题有什么好的解决方法?
我认为这里有类似的帖子,但不完全一样......
我的EF模型中有两个实体 - 让我们称之为Person和Developer,后者继承自前者.
我还有一个名为Qualifications的开发者协会.这在Person实体上不可见.
如果我正在针对上下文编写查询,我该如何自动.Include()开发人员的资格,例如
来自员工的context.Employee .Include("Qualifications")选择员工
不起作用...... EF抱怨这种关系不存在(我假设因为它在Employee上不存在 - 但是在上下文中没有Developer实体,只有Employee).
我的EF模型的一部分看起来像这样:

摘要:
现在,我正试图实现的查询:
获取有关位置ID 1234的信息,包括与这些讨论相关的任何讨论和评论.
我可以得到讨论和这样的评论:
var discussions = ctx.Posts
.OfType<Discussion>()
.Include(x => x.Comments)
.ToList();
Run Code Online (Sandbox Code Playgroud)
但我似乎无法根据位置实体上的帖子导航获取它.
我试过这个:
var locationWithDiscussionsAndComments = ctx
.Locations
.Include(x => x.Posts
.OfType<Discussion>()
.Select(y => y.Comments))
.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
哪个编译,但我得到错误:
System.ArgumentException:包含路径表达式必须引用实体定义的属性,也可以引用嵌套属性或对Select的调用.参数名称:路径
有任何想法吗?我可能会从帖子中"倒退":
var locationWithDiscussionsAndComments = ctx
.Posts
.Include(x => x.Location)
.OfType<Discussion>()
.Include(x => x.Comments)
.Where(x => x.LocationId == 1234)
.Select(x => x.Location)
.ToList();
Run Code Online (Sandbox Code Playgroud)
但就我的存储库而言,这在毛发和语义上都是错误的(我不应该通过帖子库来获取有关位置的信息).
有任何想法吗?
编辑
因此,在对它进行更大的思考之后,我意识到这OfType<T>是一个过滤操作.据我们所知,EF不支持使用预先加载进行过滤.唯一的选择是检索所有内容,或使用匿名类型投影.
我无法检索所有内容,因为涉及的元数据太多了.所以我正在尝试匿名类型投影.
c# abstract-class eager-loading navigational-properties entity-framework-ctp5