如何复合相似类型的表达式?

时间:2016-09-18 08:43:41

标签: c# linq linq-expressions linqkit

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

std::vector<std::string>

我想将这两个表达式结合起来,以便在语义上将其表示为

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

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

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

你是怎么做到的?

2 个答案:

答案 0 :(得分:1)

如果您的类型是真正的Expression s,您需要这样:

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

否则,如果它们是Func

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

就够了。

答案 1 :(得分: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))