在Linq实体和SQL中比较字符串时遇到了问题。
在Linq实体和SQL中比较字符串时遇到了问题。
我对Linq和EF还比较新。无论如何,字符串比较是否有错误?
我已经尝试了String.Equals或CompareTo,但它们返回布尔值,我了解到对于Linq,String == string的比较类似于SQL中的WHERE语句。
public IHttpActionResult GetMultifiberResult(string partNumber)
{
var list = db.MultifiberResults.Where(s => s.PartNumber ==
partNumber).ToList();
return Ok(list);
}
list应该返回一堆值,其中DB中的PartNumber列等于参数partNumber。当我使用int比较进行搜索时,它确实可以在int列中找到匹配项,但在varchar列中却找不到。控制器始终返回空并且计数为0。
比较字符串在Linq实体和SQL中出现问题的原因可能是大小写不匹配。解决方法可以忽略大小写,通过使用StringComparison.OrdinalIgnoreCase参数来比较字符串,代码如下:
public IHttpActionResult GetMultifiberResult(string partNumber) { var list = db.MultifiberResults.Where(s => s.PartNumber.Equals(partNumber, StringComparison.OrdinalIgnoreCase)).ToList(); return Ok(list); }
如果不想忽略大小写,那么代码本身是正确的。需要调试代码并展示结果,确保数据库和参数值中不存在前导或尾随空格,如果存在的话,可以使用.Trim()方法来去除空格。
这是Linq-to-Sql,所以你确定表达式树表示的`s.PartNumber.Equals(partNumber, StringComparison.OrdinalIgnoreCase)`被转换成了一些有意义的SQL语句(与`s == partNumber`不同)吗?这至少取决于Linq提供程序。你可以通过在`.Where(...)`之前使用`.AsEnumerable()`来强制在.NET上本地执行过滤,而不是在数据库服务器上执行过滤,但这可能会严重影响性能。
我认为这取决于数据库是否有不区分大小写的排序规则,如果有的话,那么这个方法就不需要。
我同意。但是,如果数据库有区分大小写的排序规则(对于相关的列),你确定你的代码实际上能正常工作吗?`StringComparison.Ordinal`会在数据库端转换成一些`COLLATE`语法吗?我不确定。