需要一种方法来获取构造给定表达式树的代码。

3
有两种方法可以在C#中构建表达式树:
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.Value1new N(outer, inner)。我不能使用 .Compile() 将它们转换为 lambda 表达式,因为我必须提供完整的表达式树以便进一步处理。我需要一种将它们集成到 MyExpression 中的方法,而我所知道的唯一方法是通过 Expression 工厂构建整个树。但是对于更复杂的查询,这变得极其复杂和容易出错。


我不明白你的问题。你想要一个将lambda表达式转换为创建表达式的代码的工具吗?为什么?请给出一个实际的例子来说明你想解决什么问题。 - poke
构建自己的解析器来构建树形结构?请查看我的SO答案:https://dev59.com/KF8f5IYBdhLWcg3wFvWn#25106688 - Ira Baxter
@poke,这样我就可以编辑它们了,当然啦 =)我需要它用于一个基于表达式的 Linq 库中,有时候组合起来会很臃肿。 - vines
@IraBaxter 是的,我考虑写一个... 但这需要我更深入地研究这个主题,所以我决定先询问一下。 - vines
1个回答

2
除了代码生成器之外,有没有其他可能性来改进我的方法并使其更具生产力?
基本上,您需要编写一个扩展ExpressionVisitor的类,该类将一个表达式的某个组件替换为另一个表达式的部分。
有自动化工具吗? LINQKit就是这样一个工具。从网站的示例中可以看出:
Expression<Func<Purchase,bool>> criteria1 = p => p.Price > 1000;
Expression<Func<Purchase,bool>> criteria2 = p => criteria1.Invoke (p)
                                             || p.Description.Contains ("a");

Console.WriteLine (criteria2.Expand().ToString());

输出:

p => ((p.Price > 1000) || p.Description.Contains("a"))


谢谢!看起来是一个解决方案,我现在会深入研究。目前唯一的担忧是LINQKit依赖于EntityFramework(至少NuGet这样说)。我工作的项目是一个轻量级库,很少与EF一起使用,并且让用户依赖于EF会有些过度杀伤力... - vines
1
@vines 原始的LINQKit(可以从作者的网站下载)不需要EF。 NuGet包的维护者建议我使用旧版本,如果您不想依赖于EF 6。 - svick
@svick 这是个好消息!谢谢! - vines

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接