【问题标题】:Why StringComparison.InvariantCultureIgnoreCase throws exception in where clause为什么 StringComparison.InvariantCultureIgnoreCase 在 where 子句中抛出异常
【发布时间】:2017-07-24 12:17:15
【问题描述】:

我正在尝试如下进行字符串同情:

var nDetails = listOfServiceUrls.Where(x => String.Equals(x.Description,  
serviceName,StringComparison.InvariantCultureIgnoreCase));

但是遇到异常,

System.ArgumentException:为调用方法“Boolean Equals(System.String, System.String, System.StringComparison)”提供的参数数量不正确

如果我删除 where 子句,它就可以正常工作!

 var nDetails = listOfServiceUrls.Where(x => String.Equals(x.Description,serviceName));

【问题讨论】:

  • 两个sn-ps有什么区别?
  • @Alexander,我的错,第二个 sn-p 没有忽略大小写,现在已修复

标签: c# .net linq


【解决方案1】:

您必须使用实体框架或类似技术,实际上需要解释作为参数提供给Where 方法的表达式。它只会翻译一小部分基类库(标准 .NET lib)方法及其重载。

将光标悬停在代码编辑器中的 listOfServiceUrls 变量上,看看它是什么类型。我的钱是IQueryable<string>(而不是IEnumerable<string>)。

EF 似乎对System.String 上的实例Equals(string, StringComparison) 方法进行了翻译,因此您可以按如下方式重写代码:

var nDetails = listOfServiceUrls.Where(
    x => x.Description.Equals(serviceName, StringComparison.InvariantCultureIgnoreCase));

与 .NET 不同,如果集合中的任何字符串恰好是 NULL,您将不会看到 NullReferenceException - 因为谓词将由 SQL Server 执行,而不是 . NET 运行时。

【讨论】:

  • 是的,我将其更改为 IQueryable 因为需要使用 where 子句加载这些记录,而 IEnumerable 会返回整个内容。是这个问题吗?
  • @Simsons,正确的。由于 EF 的解释性质,从您完全有效的 .NET 代码生成的查询语义可能不是是您所期望的。我将在几秒钟内用解决方案编辑我的答案。
【解决方案2】:

根据 Linqpad 的说法,它完美无缺……:

List<string> listOfServiceUrls = new List<string>{"one","two","three"};

var nDetails = listOfServiceUrls.Where(x => String.Equals(x,  
"Two",StringComparison.InvariantCultureIgnoreCase));

nDetails.Dump();

返回:two

删除忽略大小写不会返回任何内容(因为很明显,Two != two

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    相关资源
    最近更新 更多