EF Core 6 + PostgreSQL 大小写不敏感相等操作实现问题
问题解答
1. 排序规则设置的问题
你的排序规则定义本身无语法错误,但未实际生效,核心原因是:
- EF Core通过
ConfigureConventions全局设置字符串列排序规则,仅对新创建的数据库表/列生效。你的数据库已存在,Users.Email列仍保留默认的大小写敏感排序规则,不会被自动更新。 - 你在
OnModelCreating中定义的case_insensitive_collation若未通过迁移应用到数据库,数据库中甚至不存在这个自定义排序规则(EF Core不会自动在现有数据库中创建它)。
2. 不重建数据库/索引实现大小写不敏感搜索
方式一:使用自定义排序规则(推荐)
步骤1:手动在数据库中创建排序规则
通过PGAdmin或数据库客户端执行以下SQL,先在PostgreSQL中创建你定义的不区分大小写排序规则:
CREATE COLLATION case_insensitive_collation ( provider = 'icu', locale = 'en-u-ks-primary', deterministic = false );
步骤2:查询时显式指定排序规则
在EF Core查询中使用Collate函数,强制比较时使用该排序规则:
_dbContext.Users.Any(t => EF.Functions.Collate(t.Email, "case_insensitive_collation") == user.Email);
这样PostgreSQL会按不区分大小写的规则进行比较,识别abc@company.com与ABC@company.com为同一邮箱。
方式二:使用小写转换兼容
若不想创建自定义排序规则,可通过将两端字符串转为小写实现比较(注意:此方式可能无法利用现有索引,但符合你不新建索引的要求):
_dbContext.Users.Any(t => EF.Functions.Lower(t.Email) == user.Email.ToLower());
内容的提问来源于stack exchange,提问作者Harsh Chaturvedi
相关产品推荐
相关产品推荐

