LINQ-to-SQL で大文字と小文字を区別しない文字列比較 質問する

LINQ-to-SQL で大文字と小文字を区別しない文字列比較 質問する

大文字と小文字を区別しない文字列比較を実行するために 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" は返されません。

ベストアンサー1

あなたがおっしゃるように、ToUpper と ToLower にはいくつかの重要な違いがあり、大文字と小文字を区別しない等価チェックを行う場合、確実に正確なのは 1 つだけです。

理想的には、大文字と小文字を区別しない等価性チェックを行う最良の方法はだろう:

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

ただし、これはうまくいかないToUpperこの場合は!したがって、またはになりますToLower

注意してください序数セキュリティ上の安全を確保するには、IgnoreCase を使用します。ただし、使用する大文字と小文字を区別するチェックの種類は、目的によって異なります。ただし、一般的には、等価性チェックには Equals を使用し、並べ替えには Compare を使用し、ジョブに適した StringComparison を選択します。

Michael Kaplan (このような文化やキャラクターの扱い方に関する権威として認められている) は、ToUpper と ToLower に関する関連記事を投稿しています。

彼は「String.ToUpper –ToLowerではなくToUpperを使用し、OSの大文字小文字のルールを取得するためにInvariantCultureを指定します。

おすすめ記事