C# 在比较Linq实体和SQL中的字符串时遇到问题

C# 在比较Linq实体和SQL中的字符串时遇到问题,c#,entity-framework,linq,C#,Entity Framework,Linq,我是Linq和EF的新手 字符串的比较是否有误 我已经尝试过字符串.Equals或CompareTo,但是这些返回布尔值,我为Linq读取了比较字符串==String,它类似于SQL中的WHERE语句 public IHttpActionResult GetMultifiberResult(string partNumber) { var list = db.MultifiberResults.Where(s => s.PartNumber ==

我是Linq和EF的新手

字符串的比较是否有误

我已经尝试过字符串.Equals或CompareTo,但是这些返回布尔值,我为Linq读取了比较字符串==String,它类似于SQL中的WHERE语句

public IHttpActionResult GetMultifiberResult(string partNumber)
{
    var list = db.MultifiberResults.Where(s => s.PartNumber == 
                partNumber).ToList();

    return Ok(list);
}

列表应该返回一组值,其中DB中的列PartNumber等于参数PartNumber。当我使用int比较进行搜索时,它会在int列中找到匹配项,但不会在varchar列中找到匹配项。控制器总是返回空,计数为0。

这可能只是不匹配的情况吗?当且仅当您要忽略大小写时,请尝试此操作:

public IHttpActionResult GetMultifiberResult(string partNumber)
{
    var list = db.MultifiberResults.Where(s => s.PartNumber.Equals(partNumber, StringComparison.OrdinalIgnoreCase)).ToList();

    return Ok(list);
}

否则,您的代码就可以了。您需要调试它并向我们显示结果,并确保数据库或参数值中没有前导空格或尾随空格;在这种情况下,您应该.Trim两者。

可能是CHAR列,在这种情况下,您需要使用Trim方法在调试器中检查partNumber的值了吗?可能有一些尾随空格或隐藏字符。价值从何而来?用户输入?文件还有其他消息来源吗?也许你有问题?或者是它的变体,至少代码看起来不错。您能否在创建MultifiberResults的位置设置断点,并手动检查集合是否有一个与您尝试匹配的PartNumber相同的实例?请向我们显示一条SQL语句,该语句直接针对数据库运行,并返回所需的数据。这是Linq to SQL,因此,您确定s.PartNumber.EqualspartNumber、StringComparison.OrdinalIgnoreCase的表达式树表示形式已转换为与s==PartNumber转换为的内容不同的有意义的SQL吗?至少这取决于Linq提供程序。您可以通过在.Where…之前使用.AsEnumerable强制在.NET本地执行筛选,而不是在数据库服务器上执行筛选,但这可能会严重影响性能。@JeppeStigNielsen,我认为这取决于数据库是否具有不区分大小写的排序规则,在这种情况下,不需要这样做。我同意。但是,如果数据库对相关列具有区分大小写的排序规则,您确定您的代码确实有效吗?StringComparison.Ordinal是否会在数据库端转换为一些COLLATE语法?我不确定。