为什么StringComparison.InvariantCultureIgnoreCase在where子句中抛出异常

时间:2017-07-24 03:45:13

标签: c# .net linq

我正在努力做一个字符串同情如下:

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));

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:0)

根据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