本文向大家介绍LINQ Expression tree,可能好多人还不了解LINQ Expression tree,没有关系,看完本文你肯定有不少收获,希望本文能教会你更多东西。
LINQ Expression tree
一棵LINQ Expession tree在创建后就不可再改变。假如某个程序接收一棵Expression tree为参数,然后仅仅是用于生成别的形式的代码(例如SQL语句),那么这个不可改变性不会有什么影响。但如果一个程序想对一棵Expression tree进行修改该怎么办呢?解决方法是从来源的Expression tree复制出一棵新的树,在复制过程中根据自己的需要选择是直接复制原有节点还是创建修改了的节点。MSDN上有一个例子解释了如何实现这种需求,如何:修改表达式目录树。
更详细的LINQ Expression tree的讨论留待以后再说。先看代码:
- digraph ExpressionTree {
- node [fontsize=12, fontcolor=blue, font=Courier, shape=box]
- // node declarations
- lambda [label="Lambda Expression"]
- anoFuncSig [label="Anonymous Function\nSignature"]
- arrow [label="=>"]
- anoFuncBody [label="Anonymous Function\nBody"]
- impFuncSig [label="Implicit Anonymous\nFunction Signature"]
- expr [label="Expression"]
- impParam [label="Implicit Anonymous\nFunction Parameter"]
- uexpr1 [label="Unary Expression"]
- neg [label="-"]
- uexpr2 [label="Unary Expression"]
- id [label="Identifier:\nx"]
- simpName [label="Simple Name:\nx"]
- // relations
- lambda -> anoFuncSig
- lambda -> arrow
- lambda -> anoFuncBody
- {rank=same; anoFuncSig arrow anoFuncBody }
- anoFuncSig -> impFuncSig
- anoFuncBody -> expr
- {rank=same; impFuncSig expr }
- impFuncSig -> impParam
- expr -> uexpr1 [style=dashed]
- {rank=same; impParam uexpr1 }
- impParam -> id
- uexpr1 -> neg
- uexpr1 -> uexpr2
- {rank=same; id neg uexpr2 }
- uexpr2 -> simpName
- }
ast.dot:
- digraph ExpressionTree {
- node [fontsize=12, fontcolor=blue, font=Courier, shape=box]
- edge [fontsize=10, fontcolor=purple]
- // node declarations
- lambda [label="Lambda Expression"]
- param [label="Parameter:\nx"]
- body [label="Unary Expression\n(Negation)"]
- param2 [label="Simple Name:\nx"]
- // relations
- lambda -> param [label="Signature"]
- lambda -> body [label="Body"]
- {rank=same; param body }
- body -> param2
- param -> param2 [label="(same node)", fontsize=8, style=dashed, dir=both]
- }
【编辑推荐】