当超过 1 个实体派生自一个公共实体并保存在同一实体中时,如何按实体查询对象 table

How to query objects by entity when more than 1 entity derive from a common entity and saved in the same table

假设我有一个父 class 和 2 个子class,配置如下:

modelBuilder.Entity<ParentType>(entity =>
{
   entity.HasDiscriminator()
         .HasValue<ChildA>("ChildA")
         .HasValue<ChildB>("ChildB");
}

那么如何根据子类型拉取数据呢?

var result = context.ParentTypes.
                    .Where(x => ...);

在 table 中,我看到一个名为 Discriminator 的列,其中包含 ChildAChildB 等值。但是,x.Discriminator 上没有这样的 属性。

针对 TPH(Table 每个层次结构)Entity Framework 配置编写查询时,您可以使用 OfType<T> LinQ 方法来过滤类型。这还允许您访问派生 class 中的属性。例如,如果我们有这样的 ChildA class:

public class ChildA : ParentType
{
    public string FavouriteFood { get; set; }
}

我们可以这样查询:

var childAWhoLikeCheese = context.ParentTypes
    .OfType<ChildA>()
    .Where(x => x.FavouriteFood == "Cheese");

这实际上会创建一个类似这样的查询:

SELECT ...
FROM ParentTypes
WHERE Discriminator = "ChildA"
AND FavouriteFood = "Cheese"