ASP.NET中Linq查询Code字段大小写敏感匹配失效问题咨询
这个问题我之前也碰到过,核心原因是EF将LINQ查询转成SQL时,StringComparison.Ordinal的设置并没有被数据库正确识别——毕竟数据库的字符串比较规则是由列的默认排序规则决定的,大部分数据库默认都用不区分大小写的规则。下面给你几个可行的解决方案:
解决方案1:在查询中显式指定大小写敏感规则
如果不想修改数据库全局配置,可以直接在查询里用EF内置函数强制指定区分大小写的排序规则。以EF Core为例,使用EF.Functions.Collate方法实现:
var result = db.tbluser .Where(c => c.Email == objUser.Email && EF.Functions.Collate(c.Code, "Latin1_General_CS_AS") == objUser.Code) .FirstOrDefault();
注意:不同数据库的区分大小写排序规则名称不同:
- SQL Server用
Latin1_General_CS_AS - MySQL用
utf8mb4_bin - PostgreSQL可以用
"C"排序规则
解决方案2:修改数据库列的排序规则
直接在数据库层面把Code列的排序规则改成区分大小写的,这样所有针对该列的查询都会默认区分大小写:
- SQL Server:在SSMS中找到
tbluser表的Code列,修改排序规则为Latin1_General_CS_AS - MySQL:将
Code列的字符集设为utf8mb4,排序规则改为utf8mb4_bin
解决方案3:在EF模型配置中默认启用大小写敏感
如果你用的是EF Core,可以在DbContext的模型配置里指定Code列的默认排序规则,这样不用每次查询都手动写规则:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<tbluser>() .Property(u => u.Code) .UseCollation("Latin1_General_CS_AS"); // 替换为对应数据库的区分大小写规则 }
配置完成后,所有涉及Code字段的查询都会自动区分大小写。
内容的提问来源于stack exchange,提问作者Taha Ahmed
相关产品推荐
相关产品推荐

