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
相关产品推荐
相关产品推荐

