如何复合相似类型的表达式?
How to compound Expressions of similar types?
我有两个相同类型的表达式:
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"));
当调用 final 时,它需要传入的字符串,调用 f2 并将其结果传递给 f1,因此打印的字符串为 hello123123
同样感兴趣的是,将表达式记录到字符串中可以得到这个
p1 => Invoke(s => ("hello" + s), Invoke(s => (s + s), p1))
我有两个相同类型的表达式:
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"));
当调用 final 时,它需要传入的字符串,调用 f2 并将其结果传递给 f1,因此打印的字符串为 hello123123
同样感兴趣的是,将表达式记录到字符串中可以得到这个
p1 => Invoke(s => ("hello" + s), Invoke(s => (s + s), p1))