为什么是字符串.默认情况下,等于不区分大小写的工作

本文关键字:于不区 大小写 工作 字符串 默认 情况下 为什么 | 更新日期: 2023-09-27 17:58:53

我测试了以下表达式来评估和比较(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"))

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

x.GetAttributeValue<string>("country")的值恰好是United States上面的所有表达式都返回true。老实说,这对我来说很好,甚至很好,但与string.Equals上的MSDN文档相比似乎并不成立,该文档指出:

此方法执行顺序(区分大小写和不区分区域性)比较。

我预计必须执行以下操作,忽略整体情况:

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

有趣的是,上面总是返回false。对我来说,这是倒退。默认实现不考虑区分大小写,并且StringComparison.OrdinalIgnoreCase的显式赋值表现得像区分大小写一样,因此与United States精确值不匹配。

为什么这种行为是相反的,还是我误解了这一点?

为什么是字符串.默认情况下,等于不区分大小写的工作

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

如果这是Linq-To对象,我想你会得到不同的结果。

实际上,所有针对CRM上下文的LINQ表达式都由LINQ提供程序转换为QueryExpression。还有绳子。Equals过滤器在那里被定义为不区分大小写,所以您会得到这个结果。

关于您使用StringComparison.OrdinalIgnoreCase的尝试,IMO可能是(我认为确实如此)提供者不支持使用第二个参数的方法(我已经尝试过,但它也不会返回其他比较类型所需的结果)。

您可以尝试使用

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

而不是

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