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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:54:03