使用 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.
的自动映射器文档
我们的应用程序采用了代码优先方法。我们有一个类似于这样的简单层次结构:
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.
的自动映射器文档