2016-09-18 4 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

Я думаю, что понимаю, что вы пытаетесь сделать, порядок может быть неправильным (если так просто переключить положение f1 и f2 на 4-й строке).

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)", который может быть более эффективным, но немного сложнее, чем мой один лайнер. – Eluvatar

Смежные вопросы