2009-12-05 14 views
5

私はLinqとSqlの文字列の比較について矛盾した説明を読んでいます。Linq to Sqlの大文字と小文字を区別しない同等性

私は次のようにします。

from p in db.People 
    where p.UserName=username 
    select p 

ユーザ名= "ジョン"

私は正しい大文字小文字を区別しない結果を得ることができます。 Linqはこれをデフォルトで行っていますか、これはSQLデータベースで起こっていますか?

+0

引用符がありません。変数名の大文字/小文字を変更しても、結果には影響しません。 –

+0

thatsあなたが上記の意味を持っていないこと – zsharp

答えて

4

私はあなたのdb変数が指しているものとcompareが実際に実行された場所に基づいて、矛盾する結果が得られると思います。可能であれば、linqはクエリをビルドしてSQLサーバに送信します。

は、[T0] .col1、[T0] .col2を選択し、...、[:あなたはあなたのサンプルクエリは、おおよそ次のようなものに変換します

where p.UserName.ToLower()=username.ToLower() 
+1

申し訳ありませんが、これは悪いアドバイスです。 p.UserName.ToLower()= username.ToLower()は、完全なテーブルスキャンを強制するSQLクエリに変換されます。 "人"テーブルが小さい場合は問題ありませんが、大きなテーブルの場合は、 'username'カラムをカバーするインデックスを使用できなくなります。 – KristoferA

1

これはデータベースによって異なります。 SQL Server 2008では、インデックス式で使用する場合を含め、文字列を大文字と小文字を区別しないものとして扱います。 Linqはそれをしません。

on MSDNまたはthis articleを読んでください。

+2

大文字と小文字の区別は、データベースや関連する列でどのような照合を使用するかによって異なります(デフォルトはSQL Serverのインストール時に設定されますが、列レベル)。 – KristoferA

3

を呼び出すことによって、大文字と小文字を区別を強制することができように思えますT0] .coln [スキーマ]。[ピープル] [T0] .UserName = @ P0

から ...ユーザー名の変数の値は、@ P0のSQL変数に渡されます。したがって、大文字と小文字の区別、アクセントの感度などは、使用するSQL Serverインスタンス/ db/table/columnを設定した照合によって制御されます。他の場所に指定されていない場合は、DBまたはDBインスタンスのデフォルトの照合が使用されますが、照合は列レベルまで指定できます。

ほとんどの人は、大文字と小文字を区別しない(CI)照合を使用してSQL Serverを実行しますが、上記のように、DB内で上書きできるため、そこにある照合順序を確認するだけです。

これは、L2O(オブジェクトへのlinq)クエリと同じことを行う場合とは対照的です。この場合、大文字と小文字の区別はデフォルトであり、string.equalsオーバーライドを使用して大文字小文字を区別しないようにする必要があります文化や大文字小文字の区別を指定することができます...

+0

string.equalsのオーバーライドを使用しないと、私の結果であなたがコメントしたのと同じ問題がありますか?比較を行うには、すべてのレコードがlinq側に来るように強制しますか? –

+0

@ Jeff、string.equalsの参照は、L2SとL2Oの動作を比較したものです。その点についてはっきりしないと申し訳ありません。しかし、もしあなたが2つを組み合わせ、クライアント側でL2Oクエリとして評価を行うならば、すべてのレコードを取得するだけでなく、それらをワイヤで送信することもできます。言い換えれば、正しい照合順序を使用することが重要です。 リプライの例は、データベース内で評価されますが、左側のwhere句述部にある関数呼び出しラッパーのために、テーブルスキャンの余分なオーバーヘッドが発生します。 – KristoferA

+0

お返事ありがとうございます(以前のコメントをしたとき+1しました) –

関連する問題