2012-03-12 10 views
3

クエリ式内で動的なLinq式を使用できますか?このような 何か:式クエリ内の動的ラムダ式

from obj1 in ObjectSet1 
let res = ObjectSet2.Where(* SomeExpression *) 
where ... 
select ... 

私はSomeExpression用としてExpression.Lambda<Func<TSource, bool>>式を構築しようとしています。

  1. Expression Query内で動的Linq Expressionを使用することは可能ですか、Expression Tree全体を最初から構築する必要はありますか?
  2. SomeExpressionをビルドするときに、どうすればobj1を使用できますか?

注:Entity Frameworkを使用していますが、式ツリー内でSomeExpression.Compile()を使用することはできません。

+0

私はそうだと信じています。詳細はこちら(http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx)とこちらをご覧ください(http://naspinski.net/post/Writing-Dynamic-Linq-Queries-in-Linq-to-Entities.aspx) – Ani

+0

ありがとう、文字列述語が役立つかもしれません! Expression Builderを使用することが可能かどうか疑問に思っていましたか? Expression.Parameter(typeof(TSource)、 "obj1")は動作していないようです! –

答えて

3

これは正常ではありません。より小さな木から大きな表現木を生成することができます(これはLINQの機能です)。あなたはExpression<Func<TSource, bool>>からWhere()に渡す必要があります。

あなたはこの他のスレッドへの私の返答で - replacing operator in Where clause Lambda with a parameterを見ることができます。興味深い部分はMakeWhereLambdaメソッドです。

+0

申し訳ありませんが、式の中でクエリ反復子を使用する方法は?私は新しい式でobj1(上のサンプルから)にアクセスする必要があります。 ParameterExpressionをどのように定義しますか? –

+0

Hmmm ...あなたはそれを普通に参照することはできませんか?あなたの範囲ではないですか? S.それは入力でも出力でもないので、あなたの表現の一部ではありません。これはいわゆるフリー変数です。 –

1

あなたはそれが完全に動的になりたい場合は、一つの可能​​なオプションは、式ツリーのシリアル化を使用することです:

http://expressiontree.codeplex.com/

私は、しばらく前にこれを使用し始めたが、そのタスクが再び優先順位づけました私はどのようなタスクに適しているか分かりません。それは、それはかなり良い見えたと言った...

希望これは役立ちます。

ネイト