2017-10-26 9 views
1

LINQからコンパイル済みSQLクエリを取得しようとしています。queryがデータベースの3つの列のサブ文字列(大文字と小文字を区別しない)であるかどうかを確認します。LINQ式がSQLに変換されていない

私は次のように私が思い付く

クエリがある.NETのコア1.1を使用しています:

users.Select(u => new 
    { 
    User = u, 
    query = u.FirstName.ToLower() + u.LastName.ToLower() + u.Email.ToLower() 
    }).Where(x => x.query.Contains(query)) 

しかし、デバッグ情報を見たとき、私はこの警告になっています:

LINQ式 '(([u] .FirstName.ToLower()+ [u] .LastName.ToLower())+ [u] .Email.ToLower())。Contains(__ query_0)'を翻訳できませんでしたローカルで評価されます。私が試した

2番目のクエリ:それはまったく同じ警告を私に与え

users.Where(x => u.FirstName.ToLower().Contains(query) || u.LastName.ToLower().Contains(query) || u.Email.ToLower().Contains(query)) 

けど。

なぜそうですか? 私のようなものを探しています:私は1つの以上の実験でした

SELECT * FROM USERS WHERE FirstName LIKE query OR LastName LIKE query OR Email LIKE query 

UPDATE

users.Where(u => 
    u.FirstName.Contains(query) || 
    u.LastName.Contains(query) || 
    u.Email.Contains(query)); 

をこれも

LINQの式 'になりました(([u] .FirstName.Contains(__ query_0)OrElse [u] .LastName.Conta (__ query_2)) 'は翻訳できませんでした。 がローカルで評価されます。

+0

データベースの照合順序が 'xxx_CI'の場合、' .ToLower() 'は必要ありません。 'SELECT CONVERT(varchar、SERVERPROPERTY( 'collat​​ion'));'を確認します。 – Magnus

+0

チップのおかげで、私は 'SQL_Latin1_General_CP1_CI_AS'を持っています。私の質問がSQLにコンパイルされていない場合、大文字と小文字が区別されます。 – MaLiN2223

+0

「コンパイルされていない」とはどういう意味ですか? Linq2Objectsに対して同じクエリを実行すると、異なる動作をします。 (大文字と小文字が区別されます) – Magnus

答えて

3

.ToLower()および.Contains()は、文字列クラスの関数であり、linqプロバイダがSQLに変換できないためです。
明示的に指定されていない限り、すべてのクエリはデータベースの照合に従います。CIの場合は大文字と小文字を区別しないため、.ToLower()は不要です。 .Contains()については、エンティティ関数Likeを使用する必要があります。

users.Where(u => 
    EF.Functions.Like(u.FirstName, "%" + query + "%") || 
    EF.Functions.Like(u.LastName, "%" + query + "%") || 
    EF.Functions.Like(u.Email, "%" + query + "%")); 

ただし、これはEFコア2.0に追加されたようです。 1.1については、それを行う方法はないと思っています。私はEFをスキップして、普通の古いSQLを直接書くことをお勧めします。

+0

クエリの一部がローカルで評価されても、これは当てはまりますか? – MaLiN2223

+0

いいえ、linq2Objectの部分は大文字小文字の区別になります。 '.AsEnumerable()'を実行してクエリの一部をローカルにするように指定することをお勧めします。 – Magnus

+0

この私はアンダーテッドです。しかし、これは私の元々の質問には答えません。なぜ、上記のLINQクエリがSQLに変換されていないのですか。 – MaLiN2223

関連する問題