如何使用EF Core Fluent API创建含判断表达式的复合索引?
用EF Core创建含表达式的索引方案
你要的是把(column_x IS NOT NULL)作为索引键列的索引,不是带WHERE条件的过滤索引,EF Core的Fluent API目前没有直接支持这种表达式作为索引键的语法,有两种可行方案:
方案一:迁移中执行原生SQL脚本
生成EF Core迁移文件后,手动在Up方法里添加原生SQL语句直接创建索引,这是最直接的方式,不会额外生成冗余列:
// 在迁移文件的Up方法中添加 migrationBuilder.Sql(@"CREATE INDEX test_ix ON test_table ((column_x IS NOT NULL) DESC, column_x DESC);");
执行迁移后,数据库就会生成你需要的索引结构。
方案二:通过计算列间接创建索引
先定义一个存储型计算列,再基于这个计算列和原字段创建索引,效果和目标SQL一致,但会在表中多一个计算列:
在实体的Fluent配置中添加:
// 定义计算列 builder.Property<bool>("IsColumnXNotNull") .HasComputedColumnSql("column_x IS NOT NULL", stored: true); // 基于计算列和原字段创建降序索引 builder.HasIndex("IsColumnXNotNull", "column_x") .HasName("test_ix") .HasDescending("IsColumnXNotNull", "column_x");
生成并执行迁移后,数据库会创建对应的计算列和索引,和你要的索引逻辑等价。
注意:这两种方案都不会生成你不需要的那种带WHERE column_x IS NOT NULL的过滤索引,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Mustafa BYKSY
相关产品推荐
相关产品推荐

