当超过 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
的列,其中包含 ChildA
和 ChildB
等值。但是,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"
假设我有一个父 class 和 2 个子class,配置如下:
modelBuilder.Entity<ParentType>(entity =>
{
entity.HasDiscriminator()
.HasValue<ChildA>("ChildA")
.HasValue<ChildB>("ChildB");
}
那么如何根据子类型拉取数据呢?
var result = context.ParentTypes.
.Where(x => ...);
在 table 中,我看到一个名为 Discriminator
的列,其中包含 ChildA
和 ChildB
等值。但是,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"