代码之家  ›  专栏  ›  技术社区  ›  Philippe

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

  •  0
  • Philippe  · 技术社区  · 8 年前

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

    SuperSpecializedPerson扩展SpecializedPerson扩展(抽象)Person

    我们有两个超级专业人员和专业人员的存储库。 查询SuperSpecializedPerson时,返回的实体是所需的实体。 查询SpecializedPerson时,将返回所有SpecializedPerson以及超级SpecializedPerson(作为SpecializedPerson的实例)。这是我的问题。

    检查SQL查询请参见这部分代码 WHERE ([Extent1].[Discriminator] IN (N''SuperSpecializedPerson '',N''SpecializedPerson'')) ,我想要的地方 WHERE ([Extent1].[Discriminator] IN (N''SpecializedPerson'')) .

    我怎样才能得到唯一的专业人员?

    [编辑]我将为我的问题提供更多的背景,以找出我是否完全走错了方向:
    我必须将相同类型的DTO列表从后端返回到前端。正在根据指定的映射配置文件使用Automapper创建DTO。
    首先我查询SuperSpecializedPerson,将它们映射到DTO,然后同样的情况发生在SpecializedPerson,并连接两个列表。合并之后,我得到了两个所有超级SpecializedPerson的实例(一个只有SpecializedPerson属性)。
    所描述的模型是根据当前的知识定义的,将来可能会有第二个类扩展SpecializedPerson。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Olivier Jacot-Descombes    8 年前

    发生这种情况是因为 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的映射。有关详细信息,请参阅automapper文档 Mapping Inheritance . 尤其是 Runtime polymorphism .