与StringComparison.OrdinalIgnoreCase
的字符串比较在内存中或与IEnumerable<T>
一起使用。您正试图与IQueryable<T>
一起使用它,但您的查询的提供者不理解它。
在LINQ到SQL,你应该能够使用SqlMethods.Like(s.UserName, userName)
,像这样:
var user = db.Users.FirstOrDefault(s => SqlMethods.Like(s.UserName, userName));
SqlMethods在System.Data.Linq.SqlClient命名空间。
Like
方法是不区分大小写的,所以你应该得到预期的结果。
EDIT : I tried and get "LINQ to Entities does not recognize the method Boolean Like(System.String, System.String)
method, and this method cannot be translated into a store expression."
这似乎是EF的一个已知问题(link)。
This works for me:
db.Users.FirstOrDefault(
s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);
看来,虽然英孚已经很难翻译的静态Equals
到SQL,它没有任何问题翻译实例Equals
。这是一个很好的发现 - 它使得易于阅读,高性能的解决方案成为可能。
你也可以用一个简单的方法与ToUpperCase
或ToLowerCase
,但可能会阻止查询优化使用索引:
// Warning: this may not perform well.
var user = db.Users.FirstOrDefault(s => s.UserName.ToUpperCase() == userName.ToUpperCase());
你有没有验证用户名和s.Username都是字符串类型的。 – Tilak
很确定L2S不支持这种特殊的方法。如果这是实际的可执行C#代码,而不是查询提供程序翻译的东西,那就好了。 – Servy
你为什么要避免使用string.Compare? – tsells