2016-09-18 47 views
0

我有兩個表達式,同一類型的:如何複合相似類型的表達式?

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

我想這兩個表達式結合起來,使語義上它出來作爲

a(b(T)) 

但我不能找到合適的語法,即使使用LinqKit。

var exprC = exprA.Invoke(exprB); //不起作用

你是如何做到這一點的?

回答

1

如果你的類型是真正Expression S,你想這樣:

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

否則,如果他們是Func蒸發散:

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))',如果你擔心的效率,你可以得到每個lambda函數體替換參數並將其編譯爲:'(p1)=>「hello」+(p1 + p1)「',可以效率更高,但比我的班輪更復雜一點。 – Eluvatar

相關問題