在LINQ中不区分大小写的字符串比较
我读过使用ToUpper和ToLower执行不区分大小写的字符串比较是不明智的,但是在涉及到LINQ-to-SQL时我看不到其他选择。 String.Compare的ignoreCase和CompareOptions参数被LINQ-to-SQL忽略(如果您使用的是区分大小写的数据库,即使您要求区分大小写的比较,也可以区分大小写)。 ToLower或ToUpper是最佳选择吗? 这个比那个好吗? 我以为我在某处读到ToUpper更好,但我不知道这是否适用于此。 (我正在做很多代码评论,每个人都在使用ToLower。)
Dim s = From row In context.Table Where String.Compare(row.Name, "test", StringComparison.InvariantCultureIgnoreCase) = 0
这转换为SQL查询,它简单地将row.Name与“test”进行比较,并且不会在区分大小写的数据库上返回“Test”和“TEST”。
正如你所说,ToUpper和ToLower之间有一些重要的区别,当你试图进行不区分大小写的等式检查时,只有一个可靠准确。
理想情况下,执行不区分大小写的平等检查的最佳方法是:
String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)
请注意Ordinal IgnoreCase以确保安全。 但是,您使用的案例(中)敏感检查的类型取决于您的目的是什么。 但是在一般情况下,使用Equals进行等式检查,并在排序时进行比较,然后为作业选择正确的StringComparison。
迈克尔卡普兰(公认的文化和人物处理权威,如此)在ToUpper与ToLower上有相关的帖子:
他说:“String.ToUpper - 使用ToUpper而不是ToLower,并指定InvariantCulture以获取OS套管规则 ”
我在查询中使用了System.Data.Linq.SqlClient.SqlMethods.Like(row.Name, "test")
。
这将执行不区分大小写的比较。
我试着用Lambda表达式,它工作。
List<MyList>.Any (x => (String.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)) && (x.Type == qbType) );
上一篇: Case insensitive string compare in LINQ
下一篇: Python join: why is it string.join(list) instead of list.join(string)?