You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:35:20