You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EF Core无鉴别器列的Table per Hierarchy架构如何查询Glass实体数据

存量TPH架构下无新增鉴别器列查询Glass实体的实现方案

方案1:原生SQL直接查询

直接将Glass实体的鉴别规则作为WHERE筛选条件写入查询语句即可,无需新增鉴别器列,也不影响现有业务逻辑,VarBinary、XML等特殊类型字段可正常返回。
查询语句示例:

SELECT * FROM Product
WHERE 
    ProductID > 100000 
    AND ProductID < 200000
    AND ProductType IN (1,2,3,4,5,100);

方案2:ORM框架适配查询(以EF Core为例)

如果使用ORM框架实现TPH映射,不需要新增鉴别器列,直接基于现有字段配置动态筛选规则即可:

  • 在DbContext的模型配置方法中,为Glass子类配置全局查询筛选器,完全匹配鉴别规则
  • 配置完成后可直接查询Glass实体集合,ORM会自动拼接对应的筛选条件
    配置代码示例:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 配置TPH层级映射,无需额外新增鉴别器列
    modelBuilder.Entity<Product>()
        .HasDiscriminator<int>("EntityType")
        .HasValue<Glass>(1)
        .HasValue<Parts>(2)
        .HasValue<Others>(3);

    // 配置Glass实体的专属筛选规则
    modelBuilder.Entity<Glass>()
        .HasQueryFilter(g => 
            g.ProductID > 100000 
            && g.ProductID < 200000 
            && new[] {1,2,3,4,5,100}.Contains(g.ProductType));

    // Parts、Others实体按对应规则补充配置即可
}

查询调用示例:

var glassList = dbContext.Set<Glass>().ToList();

可选优化方案

如果查询频率较高,可基于现有筛选规则创建Glass实体的专用视图,后续直接查询视图简化调用,同时可给ProductID和ProductType添加联合索引,避免全表扫描提升查询性能。
视图创建示例:

CREATE VIEW vw_GlassProduct AS
SELECT * FROM Product
WHERE 
    ProductID > 100000 
    AND ProductID < 200000
    AND ProductType IN (1,2,3,4,5,100);

内容的提问来源于stack exchange,提问作者Jatin Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 13:18:02