表达式树,是一种非常有效的数据表达方式,可以以树的形式显示查询操作符的lambda表达式。这些表达式树中所有的数据表达式方式是可以同时进行计算的。
比如我们
int[] arr = new int[] { 12, 42, 46, 23, 3, 42, 353, 34, 43, 143, 57, 5, 68, 867, 568, 7 };
IEnumerable<int> nums = arr.Where(i => i < 100)
.OrderBy(i => i);Code language: JavaScript (javascript)
上面代码包含两个操作符,Where和OrderBy,上面的代码编译后将会产生IL代码,相当于执行了两个lambda的匿名方法。
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); //一个是传入匿名方法 编译器编译成IL代码
public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate); //一个是匿名方法的表达式 编译成表达式树Code language: JavaScript (javascript)
一个是属于Enumerable,一个是属于Queryable。
我们上一节自己封装一个方法来进行对数组的过滤。但是大家现在看,我们其实可以直接对数组进行使用Where等这些方法来进行过滤。在上面的代码,首先执行Where然后执行OrderBy。我们可以跳到Where的这两个方法里面看一下,我们可以发现它有两个重载方法,一个是接收委托方法,一个是接收表达式。
那么是什么决定了我们的lambda表达式编译成IL还是表达式树呢?那就是看
static void Main(string[] args)
{
int[] arr = new int[] { 12, 42, 46, 23, 3, 42, 353, 34, 43, 143, 57, 5, 68, 867, 568, 7 };
var query = arr.Where(x => x % 2 == 1).ToList();
var query2 = arr.AsQueryable().Where(x => x % 2 == 1).ToList();
Console.ReadKey();
}Code language: JavaScript (javascript)
Previous: C#3.0对LINQ的增强和理解Lambda表达式
Next: 关键字变量var、对象初始化和匿名类型