使用EF加载显式实体(不是扩展它的实体)

时间:2018-01-25 14:23:48

标签: c# entity-framework entity-framework-6 discriminator tph

我们的应用程序中已经有了代码优先的方法。我们有一个类似的简单层次结构:

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。

1 个答案:

答案 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的部分。

相关问题