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(链接)的已知问题.
这对我有用:
Run Code Online (Sandbox Code Playgroud)db.Users.FirstOrDefault( s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase) );
看来尽管EF很难将静态转换Equals为SQL,但翻译实例并没有问题Equals.这是一个非常好的发现 - 它使得易于阅读,高效的解决方案.
你也可以使用一个简单的方法ToUpperCase或ToLowerCase,但可能会阻止查询优化使用索引:
// Warning: this may not perform well.
var user = db.Users.FirstOrDefault(s => s.UserName.ToUpperCase() == userName.ToUpperCase());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7699 次 |
| 最近记录: |