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

表达式树可以表示一个数学公式如: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. css 温故而知新 1px的问题

    解决方法1: //border @mixin border($pos, $color) { content: ""; position: absolute; transform-o ...

  2. centos root登录password 忘记解决的方法

    Centos系统 登陆root忘记password 解决方式: (1)开机启动系统,在进入linux系统之前按键Esc 进入例如以下界面:(须要注意:Centos是安装在虚拟机里面的话,须要将鼠标点进 ...

  3. git删除所有历史提交记录,只留下最新的干净代码

    git删除所有历史提交记录,只留下最新的干净代码 1.Checkout git checkout --orphan latest_branch 2. Add all the files git add ...

  4. applicationContext-XXX.xml和XXX-servlet.xml的区别

    1.ApplicationContext.xml  是spring 全局配置文件,用来控制spring 特性的 2.dispatcher-servlet.xml 是spring mvc里面的,控制器. ...

  5. NPOI 添加下拉列表

    需求 给指定列添加下拉列表.如下图: 思路 NPOI的文档网站不能访问了,这里参考的POI文档. 加下拉列表有两种方式,一种直接写字符串,例如 new String[]{"10", ...

  6. VSCode调试.net core 2.0 输出窗口乱码

    Q:输出窗口乱码 A:修改.vscode文件夹下,tasks.json文件,具体内容见图

  7. 【深入JVM】JVM工具之JMAP

    一.工具介绍 假设把java\bin文件夹配置到环境变量.在cmd输入jmap会有例如以下提示: 翻译:打印出某个java进程(使用pid)内存内的,全部'对象'的情况(如:产生那些对象,及其数量). ...

  8. docker-maven-plugin

    顾名思义,docker-maven-plugin是一个docker的maven插件,用来执行docker镜像的制作和上传,他的地址是https://github.com/spotify/docker- ...

  9. ubuntu 下使用polipo转换HTTP代理

    ***默认是用Socks5协议的,对于Terminal的get,wget等走http协议的地方是无能为力的,所以需要转换成http代理,加强通用性,这里使用的转换方法是基于Polipo的. sudo ...

  10. 25线程基础-CLR

    由CLR via C#(第三版) ,摘抄记录... 1.线程是CPU的虚拟化,windows为每个进程提供专用线程(CPU)2.线程开销:内存和时间. 线程内核对象—OS为系统中创建的每个线程都分配并 ...