【问题标题】:How to find column value by comparing another column value in LINQ where case does not any matter [duplicate]如何通过比较LINQ中的另一个列值来查找列值,其中大小写无关紧要[重复]
【发布时间】:2017-05-23 11:49:24
【问题描述】:

这里的字符串 productname2="xyz" 但实际上在数据库中 PRODUCTNAME 是“XYZ”,当我比较它时返回 false,所以我无法获得产品代码,在这里我不仅想比较,还想从这个状态中获得一些值。

orderdetail.PRODUCTCODE = context.PRODUCTs.Where(pro => pro.PRODUCTNAME==productname2)
                         .Select(code => code.PRODUCTCODE).DefaultIfEmpty().Max();

任何帮助将不胜感激

【问题讨论】:

  • 在比较的两边都使用 ToLowerInvariant() 怎么样?
  • @wkl ToLower 存在国际化问题 - 最好使用 string.Equals(...) 的相关覆盖
  • 我不认为这在查询中得到了最好的解决。鉴于这是来自数据库,看起来您可能会更好地受益于在数据库中的列上设置正确的(不区分大小写)排序规则。通过转换大小写,您放弃了列上可能拥有的任何索引的好处。
  • @RowlandShaw 你说得对,我编辑了我的评论以使用 ToLowerInvariant。我认为应该这样做。
  • @wkl IIRC,当它被翻译成 SQL 时会爆炸。

标签: c# oracle entity-framework linq


【解决方案1】:

你必须比较字符串忽略大小写:

orderdetail.PRODUCTCODE = context.PRODUCTs.Where(pro => pro.PRODUCTNAME.Equals(productname2, StringComparison.InvariantCultureIgnoreCase).Select(code => code.PRODUCTCODE).DefaultIfEmpty().Max();

【讨论】:

  • 我强烈建议使用string.Equals 而不是instance.Equals,因为前一个调用是空安全的:) 此外,我还想问您是否需要文化感知比较或序数-后一个具有更好的性能...与往常一样,取决于您查询的数据提供者(某些调用可能不会被转换为纯 sql ...)
  • 这会转化为 SQL 吗?
  • .Select(code => code.PRODUCTCODE).DefaultIfEmpty().Max();这个选项不能正常工作,它显示语法错误
【解决方案2】:

希望对你有帮助

.Where(pro => pro.PRODUCTNAME.Equals(productname2, StringComparison.OrdinalIgnoreCase))

OrdinalIgnoreCaseCultureIgnoreCase 只是用于比较的规则不同,前者比后者执行得更好,规则更少。

【讨论】:

  • 没有语法错误但我得到了相同的结果,我没有找到区分大小写的产品代码
【解决方案3】:

有效

orderdetail.PRODUCTCODE = context.PRODUCTs.Where(pro => pro.PRODUCTNAME.ToLower().Contains(productname2.ToLower())).Select(code => code.PRODUCTCODE).DefaultIfEmpty().Max();

从此链接LINQ Contains Case Insensitive

【讨论】:

    猜你喜欢
    • 2018-06-17
    • 2020-10-27
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多