我有兩個表達式,同一類型的:如何複合相似類型的表達式?
Expression<Func<IQueryable<T>, IQueryable<T>>> exprA, exprB;
我想這兩個表達式結合起來,使語義上它出來作爲
a(b(T))
但我不能找到合適的語法,即使使用LinqKit。
var exprC = exprA.Invoke(exprB);
//不起作用
你是如何做到這一點的?
我有兩個表達式,同一類型的:如何複合相似類型的表達式?
Expression<Func<IQueryable<T>, IQueryable<T>>> exprA, exprB;
我想這兩個表達式結合起來,使語義上它出來作爲
a(b(T))
但我不能找到合適的語法,即使使用LinqKit。
var exprC = exprA.Invoke(exprB);
//不起作用
你是如何做到這一點的?
如果你的類型是真正Expression
S,你想這樣:
var c = x => a.Compile()(b.Compile()(x));
否則,如果他們是Func
蒸發散:
var c = x => a(b(x));
就夠了。
我想我明白你想要做什麼,這可能是錯誤的順序(如果是這樣,只需在第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))
這是值得注意的,這基本上是做這樣的:'(P1)=> F1(F2(P1))',如果你擔心的效率,你可以得到每個lambda函數體替換參數並將其編譯爲:'(p1)=>「hello」+(p1 + p1)「',可以效率更高,但比我的班輪更復雜一點。 – Eluvatar