表达式树和Enumerable还有Queryable的理解

表达式树,是一种非常有效的数据表达方式,可以以树的形式显示查询操作符的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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注