如何在c# (Linq)中实现上下文字符串比较忽略大小写


var foundName = await (the Context)
.Search<MyEntity>(x => x.Name.Equals(data.Name, StringComparison.OrdinalIgnoreCase))
.AsNoTracking()
.FirstOrDefaultAsync();

我得到这个错误:

LINQ表达式'DbSet() .Where(s =>s.Name。= (value: __data_Name_0, comparisonType: OrdinalIgnoreCase))'无法翻译。附加信息:'字符串的翻译。不支持带StringComparison参数的Equals' overload '。更多信息请参见https://go.microsoft.com/fwlink/?linkid=2129535。要么以可翻译的形式重写查询,要么通过插入对'AsEnumerable', 'AsAsyncEnumerable', 'ToList'或'ToListAsync'的调用显式切换到客户端计算。详见https://go.microsoft.com/fwlink/?linkid=2101038

如何实现这个查询?

你只能做一个正常的c#==string1.Equals(string2)类型比较,其他任何东西都不能被实体框架理解,这就是为什么你看到这个异常。

实际上,它被转换为SQL,并最终依赖于您为该数据库设置的排序规则。因此,如果您想要不区分大小写的比较,请确保使用不区分大小写的排序规则,如SQL_Latin1_General_CP1_CI_AS

您可以运行一些原始SQL,但我不建议这样做。例如:

var sql = "SELECT * FROM dbo.Zombies WHERE Name = 'BrainEater' COLLATE SQL_Latin1_General_CP1_CI_AS";
var blogs = await context.Zombies
.FromSqlRaw(sql)
.ToListAsync();

试试这个方法可以得到想要的结果。

var foundName = await (the Context)
.Where<MyEntity>(x => x.Name.ToLower() == data.Name.ToLower())
.AsNoTracking().FirstOrDefaultAsync();

最新更新