【问题标题】:Having problems comparing strings in Linq entities and SQL在比较 Linq 实体和 SQL 中的字符串时遇到问题
【发布时间】:2019-06-12 06:30:01
【问题描述】:

我对 Linq 和 EF 还很陌生。

字符串的比较有什么不正确的地方吗?

我已经尝试过String.EqualsCompareTo,但它们返回boolean 值,我读到Linq 比较String == string 就像来自SQL 的WHERE statement

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。

【问题讨论】:

  • 可能是CHAR列,这种情况下需要使用Trim()方法
  • 您是否在调试器中检查了partNumber 的值?可能是你有一些尾随空格或隐藏字符。价值从何而来?用户输入?文件?还有其他来源吗?
  • 也许您遇到了this 问题? (或至少它的一个变体)
  • 代码看起来不错。您可以在创建MultifiberResults 的位置放置一个断点并手动检查该集合是否有一个您尝试匹配的 PartNumber 实例?
  • 请向我们展示您直接针对数据库运行的 SQL 语句,它返回了您想要的数据。

标签: c# entity-framework linq


【解决方案1】:

会不会只是大小写不匹配?当且仅当您想忽略大小写时才尝试此操作:

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 提供程序。您可以强制过滤在 .NET 中本地执行,而不是在数据库服务器上执行,方法是在 .Where(…) 之前使用 .AsEnumerable(),但这可能会严重影响性能。
  • @JeppeStigNielsen,我认为这取决于数据库是否有不区分大小写的排序规则,在这种情况下就不需要了。
  • 我同意。但是如果数据库有大小写敏感排序规则(对于相关列),你确定你的代码真的有效吗? StringComparison.Ordinal 会在数据库端转换成一些 COLLATE 语法吗?我不确定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
相关资源
最近更新 更多