扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
Charlie Calvert讲解了表达式树的基础,他从语法描述开始,并以同Visual Studio 2008一起发行的示例程序——ExpressionTressVisualizer为例,形象地展示了如何使用表达式树。
表达式树与Lambda表达式相关联,Lambda表达式是可在行内实现预期代理和匿名代理的内容的一种方式。Ian Griffiths在他关于表达式树文章中,给出了一个非常不错的Lambda表达式介绍,以及Lambda与表达式树的关系。正如Ian所指出的,“Lambda除了语法不同以外,并没有比我已掌握的匿名方法提供更多的东西,但是,它却使一些匿名方法无法实现的事情变成了可能。”
Func nonExprLambda = x => (x & 1) == 0;Expression> exprLambda = x => (x & 1) == 0; [...] |
Charlie仔细钻研了Expression的细节:
Expression
Body:获取表达式的主体;
Parameters:获取Lambda表达示的参数;
NodeType:得到树中某些节点的表达式类型(ExpressionType),这是一个有45种不同值的枚举类型,代表表达式节点的所有可能类型,如返回常数、也可能返回参数、或者返回一个值是否小于另外一个(<),或者返回一个值是否大于另外一个(>),或者返回两个值的和(+)等等;
Type:得到表达式的静态类型,在本例中,表达式的类型是Func
在C# 3.0和VB 9.0大部分新特性中,表达式树在“LINQ,尤其是LINQ to SQL”中扮演了一个非常重要的角色:
var query = from c in db.Customers where c.City == "Nantes" select new { c.City, c.CompanyName }; |
Charlie Calvert对这种方法的使用进行了说明:
因为查询是以一种高度抽象的数据结构封装后传送给编译器的,所以,编译器可以以它期望的任一方式自由地进行翻译。查询的执行次序和途径并非强制指定的,相反,它可以对表达树进行分析,以发现你所期望的结果,然后再决定如何处理;至少在理论上,它可以独立地考虑很多因素,诸如当前的网络流量、数据库的负载、它当前已有的可用结果集等等;虽然在LINQ to SQL中,它实际上并没有去考虑所有这些因素,但在理论上它可以考虑更多它关心的因素;此外,它还可以对表达式树进行分析,并将LINQ to SQL的输出结果转换成截然不同的形式,然后传递给你手写的自定义代码。
Marlon Grech展示了如何应用表达式树,以及如何创建表达式解析器。Octavio Hernández提供了一个表达式树的表达式类层次汇总表。
濠电姷顣介埀顒€鍟块埀顒€缍婇幃妯诲緞閹邦剛鐣洪梺闈浥堥弲婊勬叏濠婂牊鍋ㄦい鏍ㄧ〒閹藉啴鏌熼悜鈺傛珚鐎规洘宀稿畷鍫曞煛閸屾粍娈搁梻浣筋嚃閸ㄤ即宕㈤弽顐ュС闁挎稑瀚崰鍡樸亜閵堝懎濮┑鈽嗗亝濠㈡ê螞濡ゅ懏鍋傛繛鍡樻尭鐎氬鏌嶈閸撶喎顕i渚婄矗濞撴埃鍋撻柣娑欐崌閺屾稑鈹戦崨顕呮▊缂備焦顨呴惌鍌炵嵁鎼淬劌鐒垫い鎺戝鐎氬銇勯弽銊ф噥缂佽妫濋弻鐔碱敇瑜嶉悘鑼磼鏉堛劎绠為柡灞芥喘閺佹劙宕熼鐘虫緰闂佽崵濮抽梽宥夊垂閽樺)锝夊礋椤栨稑娈滈梺纭呮硾椤洟鍩€椤掆偓閿曪妇妲愰弮鍫濈闁绘劕寮Δ鍛厸闁割偒鍋勯悘锕傛煕鐎n偆澧紒鍌涘笧閹瑰嫰鎼圭憴鍕靛晥闂備礁鎼€氱兘宕归柆宥呯;鐎广儱顦伴崕宥夋煕閺囥劌澧ù鐘趁湁闁挎繂妫楅埢鏇㈡煃瑜滈崜姘跺蓟閵娧勵偨闁绘劕顕埢鏇㈡倵閿濆倹娅囨い蹇涗憾閺屾洟宕遍鐔奉伓