打造自己的LINQ Provider(上):Expression Tree揭秘2010-11-27 cnblogs terrylee概述在.NET Framework 3.5中提供了LINQ 支持后,LINQ就以其强大 而优雅的编程方式赢得了开发人员的喜爱,而各种LINQ Provider更是满天飞, 如LINQ to NHibernate、LINQ to Google等,大有“一切皆LINQ”的 趋势。LINQ本身也提供了很好的扩展性,使得我们可以轻松的编写属于自己的 LINQ Provider。本文为打造自己的LINQ Provider系列文章第一篇,主 要介绍表达式目录树(Expression Tree)的相关知识。认识表达式目录 树究竟什么是表达式目录树(Expression Tree),它是一种抽象语法树 或者说它是一种,通过解析表达式目录树,可以实现我们一些特定的功 能(后面会说到),我们首先来看看如何构造出一个表达式目录树,最简单的方 法莫过于使用Lambda表达式,看下面的代码:
Expression<Func<int, int, int>> expression = (a, b) => a * b + 2;
在我们将Lambda表达式指定给 Expression<TDelegate>类型的变量(参数)时,编译器将会发出生成表 达式目录树的指令,如上面这段代码中的Lambda表达式(a, b) => a * b + 2 将创建一个表达式目录树,它表示的是一种数据结构,即我们把一行代码用数据 结构的形式表示了出来,具体来说最终构造出来的表达式目录树形状如下图所示 :

这里每一个节点都表示一个表达式,可能是一个二元运算,也可能是 一个常量或者参数等,如上图中的ParameterExpression就是一个参数表达式, ConstantExpression是一个常量表达式,BinaryExpression是一个二元表达式。 我们也可以在Visual Studio中使用Expression Tree Visualizer来查看该表达 式目录树: