为什么string.Equals默认情况下不区分大小写?

时间:2014-04-17 20:03:21

标签: c# dynamics-crm-2011

我测试了以下表达式来评估和比较(2)字符串:

.Where(x => x.GetAttributeValue<string>("country").Equals("United States"))
.Where(x => x.GetAttributeValue<string>("country").Equals("UNITED STATES"))
.Where(x => x.GetAttributeValue<string>("country").Equals("uniteD sTates"))

注意:这些查询是为使用SDK中的CRM LINQ提供程序检索数据而构建的表达式。

x.GetAttributeValue<string>("country")的值恰好是United States以上表达式的所有都会返回true。老实说,这对我来说很好,甚至很棒,但似乎并不适用于string.Equals上的MSDN documentation,其中声明:

  

此方法执行序数(区分大小写和区分大小写)比较。

期望必须执行以下操作,这会忽略整体外壳:

.Where(x => x.GetAttributeValue<string>("country").Equals("UnITed sTAtes", StringComparison.OrdinalIgnoreCase))

有趣的是,上面总是返回false。对我来说,这是倒退的。默认实现没有考虑区分大小写,StringComparison.OrdinalIgnoreCase的显式分配就像它区分大小写,因此不匹配{{1}的完全值}。

为什么这种行为反过来或者我误解了这个?

3 个答案:

答案 0 :(得分:7)

您使用的是LINQ-To-Sql吗?如果是这样,该代码实际上构建了一个表达式树,然后将其转换为在Sql Server上运行的SQL语句。与大多数数据库引擎一样,Sql Server默认不关心大小写。

如果这是Linq-To-Objects,我希望你得到不同的结果。

答案 1 :(得分:4)

实际上,针对CRM上下文的所有LINQ表达式都由LINQ提供程序转换为QueryExpression。并且string.Equals过滤器在那里定义为不区分大小写,因此您得到此结果。

关于你使用StringComparison.OrdinalIgnoreCase的尝试,IMO可能(并且我认为是)提供者不支持带有第二个参数的方法(我已经尝试了并且它没有返回其他所需的结果比较类型或者。)

答案 2 :(得分:-2)

您可以尝试使用

x.GetAttributeValue<string>("country") == "United States"

而不是

x.GetAttributeValue<string>("country").Equals("United States")