2016-09-18 8 views
0

私は、同じタイプの2つの式を、持っている:意味的にそれは類似のタイプの式をどのように合成しますか?

a(b(T)) 

として出てくるように私は、これら2つの式を組み合わせるしたいと思います。しかし、私は右を見つけることができません

Expression<Func<IQueryable<T>, IQueryable<T>>> exprA, exprB; 

をLinqKitを使用しても構文は変わりません。

var exprC = exprA.Invoke(exprB); //動作しません

どうやってこれを行いますか?彼らはFuncションであれば

var c = x => a.Compile()(b.Compile()(x)); 

そうでない場合:

答えて

1

あなたのタイプは本当にExpressionのであれば、あなたはこれをしたいが

var c = x => a(b(x)); 

十分です。

1

私はあなたがしようとしていることを理解していると思いますが、この順序は間違っている可能性があります(4行目のf1とf2の位置を切り替えてください)。

Expression<Func<string, string>> f1 = (s) => "hello" + s; 
Expression<Func<string, string>> f2 = (s) => s + s; 
var parameter = Expression.Parameter(typeof(string), "p1"); 
Expression<Func<string, string>> ffinal = Expression.Lambda<Func<string, string>>(Expression.Invoke(f1, Expression.Invoke(f2, parameter)), parameter); 
Console.WriteLine(ffinal.ToString()); 
Console.WriteLine(ffinal.Compile()("123")); 

ffinal呼び出すことが渡された文字列に、F2を呼び出し、その結果をf1に渡されるので、印刷された文字列は、文字列への式はあなたにこれを与えログイン関心もhello123123

で取り

p1 => Invoke(s => ("hello" + s), Invoke(s => (s + s), p1)) 
+0

これは基本的にこの作っていることは注目に値します:あなたは、効率を心配しているならば、あなたはそれぞれのラムダ関数の本体は、パラメータを置き換える得ることができ、 ''(P1)=> F1(F2(P1)を) '(p1)=>" hello "+(p1 + p1)" 'これを次のようにコンパイルします。私の1つのライナーよりも効率的ですが、少し複雑です。 – Eluvatar

関連する問題