EF Core+PostgreSQL大小写不敏感查询报错,求解决方案
解决EF Core + PostgreSQL字符串大小写不敏感查询报错问题
方法1:使用PostgreSQL原生ILIKE函数(推荐)
直接替换Contains为EF Core提供的EF.Functions.ILike方法,PostgreSQL的ILIKE原生支持大小写不敏感模糊匹配,完全避开排序规则相关的子串搜索限制:
var b = await _uow.SysHistoryRepository.FirstOrDefaultAsync(x => EF.Functions.ILike(x.TableName, "%Sirket%")); var a = await _uow.SysHistoryRepository.FirstOrDefaultAsync(x => EF.Functions.ILike(x.TableName, "%sirket%"));
该方法生成的SQL会使用ILIKE操作符,无需依赖全局排序规则,执行效率和兼容性都更好。
方法2:调整排序规则的确定性设置
当前配置的en-u-ks-primary是大小写不敏感的ICU排序规则,但PostgreSQL不允许在确定性排序规则上执行子串搜索操作。可以尝试将排序规则的deterministic参数设为false:
修改OnModelCreating中的排序规则定义:
modelBuilder.HasCollation("my_collation", locale: "en-u-ks-primary", provider: "icu", deterministic: false);
注意:非确定性排序规则会导致索引效率降低,且部分字符串操作的行为会变化,仅在必须依赖排序规则实现大小写不敏感时使用。
方法3:列级排序规则配置(局限性较大)
若需通过排序规则实现,可以针对单个列单独设置大小写不敏感排序规则,同时创建对应索引,但Contains这类子串搜索仍可能受PostgreSQL限制,因此不推荐作为首选方案。
内容的提问来源于stack exchange,提问作者Hakan Kaban
相关产品推荐
相关产品推荐

