2017-01-09 8 views
0

ここでstring productname2 = "xyz"が返されますが、実際にはPRODUCTNAMEのデータベースには "XYZ"ここで私はこの衛星からの何らかの価値を比較するだけでなく、いくつかの価値を求めています。LINQの大文字と小文字を区別しない列の値を比較する方法

orderdetail.PRODUCTCODE = context.PRODUCTs.Where(pro => pro.PRODUCTNAME==productname2) 
         .Select(code => code.PRODUCTCODE).DefaultIfEmpty().Max(); 

すべてのヘルプはあなたがケースを無視して文字列を比較する必要が

+2

から

orderdetail.PRODUCTCODE = context.PRODUCTs.Where(pro => pro.PRODUCTNAME.ToLower().Contains(productname2.ToLower())).Select(code => code.PRODUCTCODE).DefaultIfEmpty().Max(); 

に動作しますか? – wkl

+1

@wkl 'ToLower'は国際化の問題を抱えています - 常にstring.Equals(...)の関連するオーバーライドを使う方が良い –

+5

私はこれがクエリで最も良く解決されるとは思わない。これがDBから来ていることを考えれば、データベース内の列に対して正しい(大文字と小文字を区別しない)照合を設定するほうが効果的かもしれないようです。大文字と小文字を変換することで、列にある可能性のあるインデックスの利点が破棄されます。 – spender

答えて

3

を理解されるであろう。

orderdetail.PRODUCTCODE = context.PRODUCTs.Where(pro => pro.PRODUCTNAME.Equals(productname2, StringComparison.InvariantCultureIgnoreCase).Select(code => code.PRODUCTCODE).DefaultIfEmpty().Max(); 
+0

前の呼び出しがnullセーフであるため、 'instance.Equals'の代わりに' string.Equals'を使うことを強くお勧めします:)また、文化認識の比較が必要かどうか、または序数 - 後者はより良いパフォーマンス...いつものように、あなたが照会しているデータプロバイダによっては(一部の呼び出しが純粋なSQLに変換されない可能性があります...) –

+4

これはSQLに変換されますか? – spender

+0

.Select(code => code.PRODUCTCODE).DefaultIfEmpty()。Max();このオプションを正しく動作させないと、構文エラーが表示されます –

0

希望これは

.Where(pro => pro.PRODUCTNAME.Equals(productname2, StringComparison.OrdinalIgnoreCase)) 

OrdinalIgnoreCaseCultureIgnoreCaseに役立つだけで適用されるルールが異なり比較のために、前者が後者よりもルールが少ない

+0

構文エラーはありませんが、同じ結果が得られました。 –

0

それはどのようにあなたの比較の両側にToLowerInvariantを()の使用については、このリンクLINQ Contains Case Insensitive

関連する問題