0

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

SuperSpecializedPerson 扩展 SpecializedPerson 扩展(抽象)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。

4

1 回答 1

0

发生这种情况是因为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));

您的编辑说问题在于自动映射器的映射。请参阅映射继承的自动映射器文档。特别是具有运行时多态性的部分。

于 2018-01-25T14:28:37.993 回答