0

我有两个相同类型的表达式:

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

我想将这两个表达式结合起来,这样在语义上它就变成了

a(b(T))

但即使使用 LinqKit,我也找不到正确的语法。

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

你怎么做到这一点?

4

2 回答 2

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))
于 2016-09-18T09:03:02.167 回答
1

如果你的类型真的Expression是 s,你想要这个:

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

否则,如果它们是Functions:

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

足够的。

于 2016-09-18T08:52:54.010 回答