不区分大小写的字符串比较不适用于C#?

SB2*_*055 15 c# linq asp.net linq-to-sql

根据这个问题的答案:

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

我试图在不使用Compare或ToLower的情况下进行不区分大小写的比较:

var user = db.Users.FirstOrDefault(s => String.Equals(s.Username, username, StringComparison.OrdinalIgnoreCase));
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

为调用方法'Boolean Equals(System.String,System.String,System.StringComparison)提供的参数数量不正确

我究竟做错了什么?

das*_*ght 33

字符串比较与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));
Run Code Online (Sandbox Code Playgroud)

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)
);
Run Code Online (Sandbox Code Playgroud)

看来尽管EF很难将静态转换Equals为SQL,但翻译实例并没有问题Equals.这是一个非常好的发现 - 它使得易于阅读,高效的解决方案.

你也可以使用一个简单的方法ToUpperCaseToLowerCase,但可能会阻止查询优化使用索引:

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