繁体   English   中英

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

[英]Case-Insensitive String Comparison not working in C#?

根据这个问题的答案:

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

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

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

但是我收到一个错误:

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

我究竟做错了什么?

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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM