EF Core查询PostgreSQL自定义枚举类型报错,变量传值失效常量传值正常
问题解决:PostgreSQL UDT列在EF Core查询中类型不匹配错误
问题现象
PostgreSQL表中存在UDT(用户定义类型)列,使用EF Core查询时抛出错误:
operator does not exist: example_type = text
以下写法无法正常运行:
var type = ExampleType.ExampleValue; query.Where(e => e.Type == type)...
但直接传入枚举常量的写法可以正常工作:
query.Where(e => e.Type == ExampleType.ExampleValue)...
原因分析
EF Core解析变量表达式时,未自动将枚举变量转换为对应的PostgreSQL UDT类型,而是将其作为text类型传入数据库,导致类型不匹配;直接使用枚举常量时,EF Core能识别并正确映射为目标UDT类型,因此查询正常。
解决方案
1. 显式指定变量类型转换
在查询中显式将变量转换为目标UDT类型,提示EF Core正确生成SQL:
var type = ExampleType.ExampleValue; query.Where(e => e.Type == (ExampleType)type)...
或者使用EF Core的Cast函数强制转换:
query.Where(e => e.Type == EF.Functions.Cast<ExampleType>(type))...
2. 配置UDT与枚举的映射关系
在EF Core的模型配置中,明确指定属性对应的UDT类型,确保EF Core始终正确解析:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<YourEntity>() .Property(e => e.Type) .HasColumnType("example_type") // 指定PostgreSQL中的UDT名称 .HasConversion<ExampleType>(); // 关联枚举类型 }
3. 使用参数化查询并指定UDT类型
通过手动创建Npgsql参数,明确指定参数的UDT类型,避免类型推断错误:
var type = ExampleType.ExampleValue; var udtParam = new NpgsqlParameter("@udtValue", NpgsqlDbType.Udt) { Value = type, UdtTypeName = "example_type" // 对应PostgreSQL中的UDT名称 }; var result = query.Where(e => e.Type == (ExampleType)EF.Property<object>(e, "@udtValue")) .FromSqlRaw("SELECT * FROM your_table WHERE type = @udtValue", udtParam) .ToList();
内容的提问来源于stack exchange,提问作者Valon
相关产品推荐
相关产品推荐

