【问题标题】:How to compound Expressions of similar types?如何组合相似类型的表达式?
【发布时间】:2016-09-18 17:03:02
【问题描述】:

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

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

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

a(b(T))

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

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

你是怎么做到的?

【问题讨论】:

    标签: c# linq linq-expressions linqkit


    【解决方案1】:

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

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

    否则如果他们是Functions:

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

    够了。

    【讨论】:

      【解决方案2】:

      我想我明白你要做什么,这可能是错误的顺序(如果是这样,只需在第 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) =&gt; f1(f2(p1)),如果你担心效率,你可以让每个lambda函数的主体替换参数并编译成这样:(p1) =&gt; "hello" + (p1 + p1)"这可能比我的一个班轮更有效率,但更复杂一些。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多