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

Load explicit entity (not entities extending it) with EF

我们的应用程序采用了代码优先方法。我们有一个类似于这样的简单层次结构:

SuperSpecializedPerson 扩展 SpecializedPerson 扩展(抽象)Person

我们有两个存储库,用于 SuperSpecializedPerson 和 SpecializedPerson。 在查询 SuperSpecializedPerson 时,returned 实体就是想要的实体。 当查询 SpecializedPerson 时,所有 SpecializedPerson 以及 SuperSpecializedPerson(作为 SpecializedPerson 的一个实例)都被 returned。这是我的问题。

检查 SQL 查询是看到这部分代码 WHERE ([Extent1].[Discriminator] IN (N''SuperSpecializedPerson '',N''SpecializedPerson'')),我想在其中包含 WHERE ([Extent1].[Discriminator] IN (N''SpecializedPerson'')).

如何才能只获得 SpecializedPerson?

[edit] 我会为我的问题提供更多背景信息,以确定我是否走错了路:
我必须 return 从后端到前端的相同类型的 DTO 列表。正在根据指定的映射配置文件使用 Automapper 创建 DTO。
首先,我查询 SuperSpecializedPerson,将它们映射到 DTO,然后对 SpecializedPerson 进行同样的操作并将两个列表连接起来。合并后,我得到了所有 SuperSpecializedPerson 的两个实例(一次只有 SpecializedPerson 属性)。
所描述的模型是根据当前知识定义的,将来可能会有第二个 class 扩展 SpecializedPerson。

发生这种情况是因为 SuperSpecializedPerson 也是 SpecializedPerson。这是继承的一个基本方面。猫是一种动物。关键字 is 包括派生类型。

查询

context.SpecializedPersons.Where(p => !(p is SuperSpecializedPerson));

另一种方法的性能不如这种方法,但将来也可以使用其他派生类型,是使用 LINQ-to-Objects 进行过滤

context.SpecializedPersons
    .Where(p => /* other filters go here */)
    .AsEnumerable() // Switches to LINQ to Objects
    .Where(p => p.GetType() == typeof(SpecializedPerson));

您的编辑表明问题出在自动映射器的映射上。请参阅 Mapping Inheritance. Especially the part with Runtime polymorphism.

的自动映射器文档