1. ホーム
  2. .net

[解決済み] LINQ-to-SQLでの大文字小文字を区別しない文字列比較

2022-05-15 22:13:10

質問

大文字小文字を区別しない文字列比較を行うために 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

これは、単に row.Name と "test" を比較する SQL クエリに変換され、大文字と小文字を区別するデータベースでは "Test" と "TEST" を返すことはありません。

どのように解決するのですか?

おっしゃるとおり、ToUpper と ToLower には重要な違いがあり、大文字小文字を区別しない等値チェックを行おうとすると、どちらか一方だけが確実に正しいのです。

理想的には、大文字小文字を区別しない等値チェックを行うための最良の方法は :

String.Equals(row.Name, "test", StringComparison.OrdinalIgnoreCase)

ただし これは は機能しません。 になります。したがって、私たちは ToUpper または ToLower .

に注意してください。 序数 IgnoreCase を使ってセキュリティセーフにしています。 しかし、正確にどのような種類の大文字小文字を区別するチェックを行うかは、あなたの目的が何であるかに依存します。 しかし、一般的には、等号チェックにはEqualsを使い、ソートするときにはCompareを使い、そして仕事に適したStringComparisonを選びます。

Michael Kaplan (文化とこのような文字処理の権威) は、ToUpper 対 ToLower について関連した投稿をしています。

彼は "String.ToUpper-と言っています。 ToLowerではなくToUpperを使用し、OSのケーシング規則を拾うためにInvariantCultureを指定する。 "。