2016-03-31 6 views
2

私は、このLINQクエリではExpressionクラスを使用して

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1 

var items = from item in context.TEntity 
where expression 
select item 

としてLINQクエリでカスタムクエリのためのExpressionクラスを使用する方法があります場合、私はどこにこの使用してLINQ機能を実行する方法があります知っていると思いまして関数は、パラメータとして式をとりますが、私は本当にこの使用してLINQは

ノートを照会実行する必要があります。上記のコードは、私はそれが実際の作業コード

ではありません何をしようとしているあなたは周りを取得するために一例に過ぎません

注2:これはEntiと連携するために必要ですty Framework

答えて

3

残念ながら、Entity Frameworkはこのタイプの表現プロジェクションをネイティブにサポートしていないため、where expression.Compile().Invoke(item);のような一般的な試みでは実行時に例外がスローされます。あなたは(式ビジター利用)LinqKitライブラリを使用してエンティティセットに.AsExpandable()を呼び出す場合

しかし、あなたがして動的に表現を呼び出すことができます。

Expression<Func<TEntity, bool>> expression = x => x.Id == 1; 

var items = from item in context.Set<TEntity>.AsExpandable() 
where expression.Invoke(item) 
select item; 
+0

を認識していないので、私はちょうどEF6上の簡単なテストプロジェクトを作り、それがそこに動作しません。 Invokeは、AsExpandableと連携して動作するLinqkitの拡張メソッドです。 –

+1

これはLinqKitを使ってうまくいきます。 – Jcl

+0

@DavidL、ああ、今は理にかなっています。更新していただきありがとうございます。 –

1

を。これは、少なくともEFコアで、動作します(私はちょうどそれをテストした)。 EF6プロジェクトを手軽に試してみてください。

Expression<Func<TEntity, bool>> expression = (x) => x.Id = 1 

var items = from item in context.TEntity 
where expression.Compile()(item); 
select item 

更新:あなたが正しいおっと、それは表現の呼び出し

+0

私は真にEFコアで働いていたことに本当に驚いています...ローカルフィルタリング(サポートが予定されていると聞いていました)を行っているのか、実際にSQLに変換しているのかをチェックする必要があります。 – Jcl

+2

実際にはローカルフィルタリングを行います。したがって、実行時例外はなくなりましたが、DB側で確実に実行されるようにするには、ログを有効にしてすべてのクエリをチェックする必要があります。 –

+0

@IvanStoevええ、それは私の推測でした...私はロギングを有効にしようとしましたが、一貫性のある方法ではないようで、テストする時間はあまりありませんでした。バージョン、およびgithubの問題で見つかった最後の方法は、公開されたnugetパッケージでは機能しませんでした) – Jcl

関連する問題