C# Linq如何实现EF上下文忽略大小写的字符串比对查询
这个报错是因为EF Core 不支持将带StringComparison参数的string.Equals重载翻译为原生SQL,所以无法执行服务端查询。你可以选择以下几种方案实现需求:
方案1:统一转换大小写后对比(通用兼容方案)
所有EF Core版本和数据库都支持该写法,会被翻译为SQL原生的LOWER/UPPER函数,在服务端完成过滤:
var foundName = await theContext .Search<MyEntity>(x => x.Name.ToLower() == data.Name.ToLower()) .AsNoTracking() .FirstOrDefaultAsync();
方案2:配置列排序规则为大小写不敏感(性能最优方案)
你可以在实体映射时给Name字段指定大小写不敏感的排序规则,配置完成后直接用==匹配就会自动忽略大小写,同时可以命中数据库索引,性能最高。
以SQL Server为例,配置代码如下:
// 在DbContext的OnModelCreating方法中配置 modelBuilder.Entity<MyEntity>() .Property(e => e.Name) .UseCollation("SQL_Latin1_General_CP1_CI_AS");
配置完成后的查询代码:
var foundName = await theContext .Search<MyEntity>(x => x.Name == data.Name) .AsNoTracking() .FirstOrDefaultAsync();
方案3:使用EF.Functions.Like方法
EF Core 5及以上版本支持EF.Functions.Like方法的翻译,也可以实现忽略大小写匹配,同样走服务端查询:
var foundName = await theContext .Search<MyEntity>(x => EF.Functions.Like(x.Name, data.Name)) .AsNoTracking() .FirstOrDefaultAsync();
注意:不要直接插入
AsEnumerable/ToList等切换到客户端评估的调用,除非你能确定待过滤的数据量极小,否则会把全表数据拉到本地内存过滤,数据量大时会出现严重的性能问题甚至内存溢出。
内容的提问来源于stack exchange,提问作者user1410223
相关产品推荐
相关产品推荐

