LINQ to Entities の大文字と小文字を区別する比較 質問する

LINQ to Entities の大文字と小文字を区別する比較 質問する

これは、LINQ to Entities では大文字と小文字を区別しない比較です。

Thingies.First(t => t.Name == "ThingamaBob");

LINQ to Entities を使用して大文字と小文字を区別した比較を実現するにはどうすればよいですか?

ベストアンサー1

それはあなたが使っているからですエンティティへの LINQこれは、ラムダ式をSQL文に変換することです。つまり、大文字と小文字の区別は、デフォルトでSQL Serverに依存します。SQL_ラテン1_一般_CP1_CI_AS照合順序であり、大文字と小文字は区別されません。

使用オブジェクトクエリ.ToTraceString実際に SQL Server に送信された生成された SQL クエリを確認すると、謎が明らかになります。

string sqlQuery = ((ObjectQuery)context.Thingies
        .Where(t => t.Name == "ThingamaBob")).ToTraceString();

作成するとエンティティへの LINQクエリ、エンティティへの LINQLINQパーサーを利用してクエリを処理し、それをLINQ式ツリーに変換します。LINQ式ツリーは次に渡されます。オブジェクトサービスAPIは式ツリーをコマンドツリーに変換します。その後、ストアプロバイダー(SqlClientなど)に送信され、コマンドツリーがネイティブデータベースコマンドテキストに変換されます。クエリはデータストアで実行され、結果は具体化されたの中へエンティティオブジェクトによるオブジェクトサービス大文字と小文字の区別を考慮するロジックは挿入されていません。したがって、述語にどのような大文字と小文字を入力しても、その列の SQL Server 照合順序を変更しない限り、SQL Server では常に同じものとして扱われます。

サーバー側ソリューション:

したがって、最善の解決策は、名前コラムの集計するテーブルラテン1_一般_CS_ASこれを SQL Server で実行すると、大文字と小文字が区別されます。

ALTER TABLE Thingies
ALTER COLUMN Name VARCHAR(25)
COLLATE Latin1_General_CS_AS

詳細については、SQL Server 照合、見てみましょうSQL SERVER 大文字と小文字を区別する SQL クエリ検索の照合

クライアント側ソリューション:

クライアント側で適用できる唯一の解決策は、LINQ からオブジェクトへあまりエレガントではないと思われるもう一つの比較をします。

Thingies.Where(t => t.Name == "ThingamaBob")
        .AsEnumerable()
        .First(t => t.Name == "ThingamaBob");

おすすめ記事