LINQ-to-SQL中不区分大小写的字符串比较

Blu*_*kMN 133 .net sql linq vb.net linq-to-sql

我已经读过使用ToUpper和ToLower来执行不区分大小写的字符串比较是不明智的,但是在LINQ-to-SQL方面我没有其他选择.LINQ-to-SQL忽略String.Compare的ignoreCase和CompareOptions参数(如果您使用区分大小写的数据库,即使您要求不区分大小写的比较,也会得到区分大小写的比较).ToLower或ToUpper是最好的选择吗?这个比那个好吗?我以为我读过ToUpper更好的地方,但我不知道这是否适用于此.(我正在进行大量的代码审查,每个人都在使用ToLower.)

Dim s = From row In context.Table Where String.Compare(row.Name, "test", StringComparison.InvariantCultureIgnoreCase) = 0
Run Code Online (Sandbox Code Playgroud)

这转换为一个SQL查询,它简单地将row.Name与"test"进行比较,并且不会在区分大小写的数据库上返回"Test"和"TEST".

And*_*ott 109

正如您所说,ToUpper和ToLower之间存在一些重要的差异,当您尝试进行不区分大小写的相等性检查时,只有一个是可靠的.

理想情况下,进行不区分大小写的相等性检查的最佳方法:

String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

注意,但是,这并不能工作在这种情况下!因此,我们坚持ToUpperToLower.

请注意Ordinal IgnoreCase以使其安全.但确切地说,您使用的案例(中)敏感检查的类型取决于您的目的.但是通常在排序时使用Equals进行等式检查和比较,然后为作业选择正确的StringComparison.

迈克尔卡普兰(一个公认的文化和角色处理权威,如此)在ToUpper与ToLower上有相关的帖子:

他说"String.ToUpper - 使用ToUpper而不是ToLower,并指定InvariantCulture以获取操作系统套管规则 "

  • 好吧,如果您有一个区分大小写的数据库,并且您以大写字母存储并以大写字母搜索,则不会获得匹配.如果您在搜索中对数据和查询进行了大写操作,那么您将为每个查询转换您正在搜索的所有文本,这不符合要求. (3认同)
  • 我同意.对不起,我不清楚.我提供的示例代码与您在原始问题中指出的Linq2Sql不兼容.我只是重申,你开始的方式是一个很好的方式 - 如果它只在这种情况下工作.是的,另一个Mike Kaplan肥皂盒是SQL Server的角色处理到处都是.如果你需要不区分大小写并且无法以其他方式获取它,我建议(不清楚)将数据存储为大写,然后将其作为大写查询. (2认同)

And*_*vey 72

System.Data.Linq.SqlClient.SqlMethods.Like(row.Name, "test") 在查询中使用 过.

这将执行不区分大小写的比较.

  • System.Data.Linq.SqlClient.SqlMethods.Like(row.Name,"test")与row.Name.Contains("test")相同.正如安德鲁所说,这取决于sql server的整理.所以Like(或contains)并不总是执行不区分大小写的比较. (10认同)
  • 哈!多年来一直在使用linq 2 sql但是直到现在才看到SqlMethods,谢谢! (3认同)
  • 辉煌!但是可以使用更多细节.这是Like的预期用途之一吗?是否有可能导致误报结果的输入?还是假阴性结果?关于这种方法的文档是缺乏的,*将*描述Like方法的操作的文档在哪里? (3认同)
  • 请注意,这会使代码与`SqlClient`结合起来. (3认同)
  • 我认为它只依赖于SQL Server如何比较字符串,这可能在某处可配置. (2认同)
  • 这应该是接受的答案,因为它是基于问题的正确答案. (2认同)

小智 6

我使用Lambda表达式尝试了这个,并且它有效.

List<MyList>.Any (x => (String.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)) && (x.Type == qbType) );

  • 那是因为你正在使用`List <>`,这意味着比较发生在内存(C#代码)而不是`IQueryable`(或`ObjectQuery`),它将在database_中执行比较_. (16认同)
  • @drzaus 所说的。这个答案完全是错误的,考虑到上下文是 linq2sql,而不是常规的 linq。 (2认同)