c# - 当多个实体派生自一个公共实体并保存在同一个表中时,如何按实体查询对象
问题描述
假设我有一个包含 2 个子类的父类,配置如下:
modelBuilder.Entity<ParentType>(entity =>
{
entity.HasDiscriminator()
.HasValue<ChildA>("ChildA")
.HasValue<ChildB>("ChildB");
}
那么如何根据子类型拉取数据呢?
var result = context.ParentTypes.
.Where(x => ...);
在表中,我看到一个名为Discriminator
值的列,例如ChildA
和ChildB
。但是,在 上没有这样的属性x.Discriminator
。
解决方案
在针对 TPH(按层次结构表)实体框架配置编写查询时,您可以使用OfType<T>
LinQ 方法来过滤类型。这还允许您访问该派生类中的属性。例如,如果我们有一个这样的ChildA
类:
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"
推荐阅读
- distance - 使用空间索引提升点到多边形的距离查询
- database - 数据库设计协助
- php - 我想删除路由登录而不干扰我的登录,Laravel 7
- xml - XML 序列化 - 原始文本(转义和字符)
- sql - STRING_AGG 具有不同的无子查询
- macos - 如何从 mac 上的 node.js 脚本启动电子应用程序?
- swift - navigationItem 显示很高 swift 5
- asp.net-core - 如何在 IIS 上使用 ASP.NET Core 3.1 API 部署 Angular SPA?
- dom - 我可以从 Geotools 中的 DOM 节点解析 GML Surface 吗?
- visual-studio - 未知解决方案项目类型 Visual Studio for MAC