我们的应用程序中已经有了代码优先的方法。我们有一个类似的简单层次结构:
SuperSpecializedPerson扩展了SpecializedPerson extends(抽象)Person
我们为SuperSpecializedPerson和SpecializedPerson提供了两个存储库。 查询SuperSpecializedPerson时,返回的实体是想要的实体。 查询SpecializedPerson时,将返回所有SpecializedPerson以及SuperSpecializedPerson(作为SpecializedPerson的实例)。这是我的问题。
检查SQL查询是看到代码WHERE ([Extent1].[Discriminator] IN (N''SuperSpecializedPerson '',N''SpecializedPerson''))
的这一部分,我希望WHERE ([Extent1].[Discriminator] IN (N''SpecializedPerson''))
。
我怎样才能获得SpecializedPerson?
[编辑]我将为我的问题提供更多背景信息,以确定我是否完全走错了道路:
我必须从后端到前端返回相同类型的DTO列表。根据指定的映射配置文件,使用Automapper创建DTO
首先,我查询SuperSpecializedPerson,将它们映射到DTO,然后对SpecializedPerson进行同样的操作并连接两个列表。合并后,我得到所有SuperSpecializedPerson的两个实例(一次只有SpecializedPerson属性)。
所描述的模型已根据当前知识定义,并且将来可能会有第二个类扩展SpecializedPerson。
答案 0 :(得分:0)
这是因为SuperSpecializedPerson
也是SpecializedPerson
。这是继承的一个基本方面。猫是动物。关键字is
包含派生类型。
使用
查询context.SpecializedPersons.Where(p => !(p is SuperSpecializedPerson));
另一种不像这个那样执行但在将来使用其他派生类型的方法是使用LINQ到对象进行过滤
context.SpecializedPersons
.Where(p => /* other filters go here */)
.AsEnumerable() // Switches to LINQ to Objects
.Where(p => p.GetType() == typeof(SpecializedPerson));
您的编辑说问题是与automapper的映射。请参阅Mapping Inheritance的automapper文档。特别是Runtime polymorphism的部分。