有两种方法可以在C#中构建表达式树:
1. 让编译器重写Lambda并存储结果; 2. 逐步构建,调用Expression类提供的工厂方法。
第一种方法很简单,但它不允许将已有的子表达式集成到结果表达式中,这是我的主要目标。(这些子表达式按设计作为函数参数传递给我)。
事实上,第二种方法本身就是子表达式组合过程,但除了最简单的没有或只有少量嵌套的表达式外,它非常繁琐。
因此,为了兼顾两种方法的优点,同时必须逐步构建树,我查看编译器生成的表达式,并将其用作提示。 我所做的是:编写构建树的代码,同时查看给定的树。 整个过程相当例行,所以我想知道:
1. 是否有自动化工具可以完成这项工作? 我自己找不到。 2. 除了代码生成器,是否还有其他可能性来改进我的方法并使其更加高效?
这里是为什么我需要这种奇怪过程的解释。
1. 让编译器重写Lambda并存储结果; 2. 逐步构建,调用Expression类提供的工厂方法。
第一种方法很简单,但它不允许将已有的子表达式集成到结果表达式中,这是我的主要目标。(这些子表达式按设计作为函数参数传递给我)。
事实上,第二种方法本身就是子表达式组合过程,但除了最简单的没有或只有少量嵌套的表达式外,它非常繁琐。
因此,为了兼顾两种方法的优点,同时必须逐步构建树,我查看编译器生成的表达式,并将其用作提示。 我所做的是:编写构建树的代码,同时查看给定的树。 整个过程相当例行,所以我想知道:
1. 是否有自动化工具可以完成这项工作? 我自己找不到。 2. 除了代码生成器,是否还有其他可能性来改进我的方法并使其更加高效?
这里是为什么我需要这种奇怪过程的解释。
Expression<Func<IEnumerable<N>, IEnumerable<N>, IEnumerable<N>>>
MyExpression = (src1, src2) =>
src1.SelectMany(outer => lookup[outer.Value1].Select(
inner => new N(outer, inner)));
现在,我有两个子表达式需要替换 outer.Value1
和 new N(outer, inner)
。我不能使用 .Compile()
将它们转换为 lambda 表达式,因为我必须提供完整的表达式树以便进一步处理。我需要一种将它们集成到 MyExpression
中的方法,而我所知道的唯一方法是通过 Expression
工厂构建整个树。但是对于更复杂的查询,这变得极其复杂和容易出错。