表达式树就像是树形的数据结构,表达式树中的每一个节点都是表达式,

表达式树可以表示一个数学公式如:x<y。x、<、y都是一个表达式,并构成树形的数据结构

表达式树使lambda表达式的结构变得透明清楚,

Expression<Func<Student, bool>> isTeenAgerExpr = s => s.age >  && s.age < ;

编译器将上面的表达式翻译成下面的表达式树

Expression.Lambda<Func<Student, bool>>(
Expression.AndAlso(
Expression.GreaterThan(Expression.Property(pe, "Age"), Expression.Constant(, typeof(int))),
Expression.LessThan(Expression.Property(pe, "Age"), Expression.Constant(, typeof(int)))),
new[] { pe });

你可以手动创建一个表达式树,如下

Func<Student, bool> isAdult = s => s.age >= ;

1.先创建参数节点

ParameterExpression pe = Expression.Parameter(typeof(Student), "s");

2.再创建属性节点

MemberExpression me = Expression.Property(pe, "Age");

3.再创建常量表达式节点

ConstantExpression constant = Expression.Constant(, typeof(int));

4.再创建比较节点

BinaryExpression body = Expression.GreaterThanOrEqual(me, constant);

5.创建表达式树

var isAdultExprTree = Expression.Lambda<Func<Student, bool>>(body, new[] { pe });

下图展示构建表达式树的过程

Func<T>类型的委托将编辑成可执行代码,而Expression<TDelegate>将编译成表达式树

可执行代码运行在同一个应用程序域中,并且操作内存中的集合,

Enumerable静态类包含一些扩展方法操作内存中的集合(实现IEnumerable<T>接口的集合。如List<T>,Dictionary<T>)

Enumerable静态类的扩展方法接收Func类型的参数,然后编译成中间语言操作内存中的个集合

Func委托是一行可执行代码。如果你debug代码,你会发现Func委托是一个不透明的代码

Expression<T>将编译成表达式树的数据结构

LINQ查询不是在同一个应用域中运行,例如下面的查询语句实际上永远不会在你的应用程序中运行

var query = from s in dbContext.Students
where s.Age >=
select s;

它将被翻译成SQL语句,然后在数据库服务器上运行

一个查询表达式被翻译成SQL语句,作为一个字符串传递给另一个程序,例如LINQ-to-SQL或EntityFramework,将在数据库服务器上运行

很明显,将表达式树翻译成SQL语句比将IL代码翻译成SQL语句更容易。

很容易的从表达式树中获取信息

Queryable静态类中包含一些扩展方法接收一个Expression类型的参数,该参数将被转换成表达式树,作为数据结构传递给LINQ提供者,提供者将表达式创建成适当的查询语句并执行

LINQ 学习路程 -- 查询操作 Expression Tree的更多相关文章

  1. LINQ 学习路程 -- 查询操作 OrderBy & OrderByDescending

    Sorting Operator Description OrderBy 通过给定的字段进行升序 降序 排序 OrderByDescending 通过给定字段进行降序排序,仅在方法查询中使用 Then ...

  2. LINQ 学习路程 -- 查询操作 Deferred Execution of LINQ Query 延迟执行

    延迟执行是指一个表达式的值延迟获取,知道它的值真正用到. 当你用foreach循环时,表达式才真正的执行. 延迟执行有个最重要的好处:它总是给你最新的数据 实现延迟运行 你可以使用yield关键字实现 ...

  3. LINQ 学习路程 -- 查询操作 Aggregate

    聚合操作执行数学的运算,如平均数.合计.总数.最大值.最小值 Method Description Aggregate 在集合上执行自定义聚集操作 Average 求平均数 Count 求集合的总数 ...

  4. LINQ 学习路程 -- 查询操作 Join

    Join操作是将两个集合联合 Joining Operators Usage Join 将两个序列连接并返回结果集 GroupJoin 根据key将两个序列连接返回,像是SQL中的Left Join ...

  5. LINQ 学习路程 -- 查询操作 where

    1.where Filtering Operators Description Where Returns values from the collection based on a predicat ...

  6. LINQ 学习路程 -- 查询操作 GroupBy ToLookUp

    Grouping Operators Description GroupBy GroupBy操作返回根据一些键值进行分组,每组代表IGrouping<TKey,TElement>对象 To ...

  7. LINQ 学习路程 -- 查询操作 let into关键字

    IList<Student> studentList = new List<Student>() { , StudentName = } , , StudentName = } ...

  8. LINQ 学习路程 -- 查询操作 Select, SelectMany

    IList<Student> studentList = new List<Student>() { , StudentName = "John" }, , ...

  9. LINQ 学习路程 -- 查询操作 OfType

    OfType操作根据集合中的元素是否是给定的类型进行筛选 IList mixedList = new ArrayList(); mixedList.Add(); mixedList.Add(" ...

随机推荐

  1. uboot和内核分区的改动

    随着内核的更新,内核越来越大,uboot给nand的kernel分区默认是2M的 device nand0 <nandflash0>, # parts = 4  #: name       ...

  2. CentOS yum 命令出现 [Errno 14] curl#6 - &quot;Couldn&#39;t resolve host ...&quot; 的解决方法

    安装svn的时候,发现报错说一个地址无法訪问. # yum list | grep subversion http://opensource.wandisco.com/centos/7/svn-1.8 ...

  3. Hadoop2.6.0版本MapReudce示例之WordCount(二)

    继<Hadoop2.6.0版本MapReudce示例之WordCount(一)>之后,我们继续看MapReduce的WordCount示例,看看如何监控作业运行或查看历史记录,以及作业运行 ...

  4. Borg Maze - poj 3026(BFS + Kruskal 算法)

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9821   Accepted: 3283 Description The B ...

  5. 【SQLServer2008】之如何导入mdf,ldf文件、导入.mdf文件报错解决问题以及如何获得Authenticated Users 权限

    一.如何导入mdf,ldf文件: 链接:http://jingyan.baidu.com/article/09ea3ede21258cc0afde3943.html 二.导入.mdf文件报错解决问题 ...

  6. 多媒体开发之---H264 RTSP交互过程

    OPTIONS rtsp://192.168.1.154:8557/h264 RTSP/1.0 CSeq: 1 User-Agent: VLC media player (LIVE555 Stream ...

  7. Laravel开发:Laravel框架门面Facade源码分析

    前言 这篇文章我们开始讲 laravel 框架中的门面 Facade,什么是门面呢?官方文档: Facades(读音:/fəˈsäd/ )为应用程序的服务容器中可用的类提供了一个「静态」接口.Lara ...

  8. springmvc demo

    [说明]今天上午稍稍偏了一下方向,看了看servlet的相关知识,下午做maven+spring+springMVC的整合,晚上成功实现了一个小demo(可以在jsp动态页面上获得通过地址栏输入的参数 ...

  9. Gone Fishing(贪心)

    Gone Fishing John is going on a fising trip. He has h hours available (1 ≤ h ≤ 16), and there are n ...

  10. 第一课 第一个nodejs程序

    这就是我们的第一个程序了 在控制台会输出:hello 我们需要运行该文件 开始->运行 cmd 进入我们的程序目录 我的是D:/nodejs/hello.js 进入程序目录cd D:/nodej ...