在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上有相关的帖子:

  • http://www.siao2.com/2007/10/01/5218976.aspx
  • http://www.siao2.com/2005/03/10/391564.aspx
  • 他说:“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) );

    链接地址: http://www.djcxy.com/p/13075.html

    上一篇: Case insensitive string compare in LINQ

    下一篇: Python join: why is it string.join(list) instead of list.join(string)?