本文发表在 rolia.net 枫下论坛如果你看过Lambra Expression Tree的原理,就明白所有的Linq语句from ... where ... select 最后就要变成Lambra表达式,系统在把Lambra表达式变成Lambra Expression Tree,然后编译,然后运行。
什么是Lambra Expression Tree呢?简单说一句,比如有如下这个表达式
Expression<Func<int, int, int>> expression = (a, b) => a+ b;
它的目的是,有两个int型的输入参数a,b,要求这个函数返回a+b的值,那么这个表达式
(a, b) => a+ b
可以用一棵树的形式来表达,分别是
BinaryExpression(代表 a+b 这样一个动作,Root)
|
ParameterExpression(代表变量 a, Leaf) ParameterExpression(代表变量 b, Leaf)
系统在把 (a, b) => a+ b 翻译成我写出的那个表达式tree之后,自己编译,然后运行,就得出a+b的答案
这些动作在.net 3.5里可以用程序或者参数来控制,从而达到超级动态的目的,俺现在正在用这个特性写一个小项目,实现类似t-sql里面的 select ... from ... where ,目的是让操作人员自己输入一系列text文本的的“select ... where” 然后从一个特定的数据源中选出自己想要的数据
不过,也有一部分人的观点是不要去碰Expression Tree,因为这是很复杂的一个过程。因为用Linq的目的是把复杂的事情简单化,现在用Expression Tree等于又要回到复杂的世界中去更多精彩文章及讨论,请光临枫下论坛 rolia.net
什么是Lambra Expression Tree呢?简单说一句,比如有如下这个表达式
Expression<Func<int, int, int>> expression = (a, b) => a+ b;
它的目的是,有两个int型的输入参数a,b,要求这个函数返回a+b的值,那么这个表达式
(a, b) => a+ b
可以用一棵树的形式来表达,分别是
BinaryExpression(代表 a+b 这样一个动作,Root)
|
ParameterExpression(代表变量 a, Leaf) ParameterExpression(代表变量 b, Leaf)
系统在把 (a, b) => a+ b 翻译成我写出的那个表达式tree之后,自己编译,然后运行,就得出a+b的答案
这些动作在.net 3.5里可以用程序或者参数来控制,从而达到超级动态的目的,俺现在正在用这个特性写一个小项目,实现类似t-sql里面的 select ... from ... where ,目的是让操作人员自己输入一系列text文本的的“select ... where” 然后从一个特定的数据源中选出自己想要的数据
不过,也有一部分人的观点是不要去碰Expression Tree,因为这是很复杂的一个过程。因为用Linq的目的是把复杂的事情简单化,现在用Expression Tree等于又要回到复杂的世界中去更多精彩文章及讨论,请光临枫下论坛 rolia.net