不区分大小写的字符串比较在 C# 中不起作用

本文关键字:不起作用 比较 字符串 大小写 不区 | 更新日期: 2023-09-27 18:37:04

基于这个问题的答案:

如何进行不区分大小写的字符串比较?

我正在尝试在不使用比较或降低的情况下进行不区分大小写的比较:

var user = db.Users.FirstOrDefault(s => String.Equals(s.Username, username, StringComparison.OrdinalIgnoreCase));

但是我收到一个错误:

为调用方法"布尔值"提供的参数数不正确 Equals(System.String, System.String, System.StringComparison)'

我做错了什么?

不区分大小写的字符串比较在 C# 中不起作用

StringComparison.OrdinalIgnoreCase的字符串比较在内存或IEnumerable<T>中工作。您正在尝试将其与 IQueryable<T> 一起使用,但可查询对象的提供者无法理解它。

在Linq-to-SQL中,你应该能够使用SqlMethods.Like(s.UserName, userName),像这样:

var user = db.Users.FirstOrDefault(s => SqlMethods.Like(s.UserName, userName));

SqlMethods 位于 System.Data.Linq.SqlClient 命名空间中。

Like方法不区分大小写,因此您应该获得预期的结果。

编辑:我尝试并得到"LINQ to Entities无法识别该方法Boolean Like(System.String, System.String)方法,并且此方法无法转换为存储表达式。

这似乎是 EF(链接)的已知问题。

这对我有用:

db.Users.FirstOrDefault(
     s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);

看起来,尽管 EF 很难将静态Equals转换为 SQL,但它将实例转换为 Equals 没有问题。这是一个非常好的发现 - 它提供了一个易于阅读的高性能解决方案。

您也可以对 ToUpperCaseToLowerCase 使用更简单的方法,但这可能会阻止查询优化器使用索引:

// Warning: this may not perform well.
var user = db.Users.FirstOrDefault(s => s.UserName.ToUpperCase() == userName.ToUpperCase());