LINQ 学习路程 -- 查询操作 Expression Tree
表达式树就像是树形的数据结构,表达式树中的每一个节点都是表达式,
表达式树可以表示一个数学公式如: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的更多相关文章
- LINQ 学习路程 -- 查询操作 OrderBy & OrderByDescending
Sorting Operator Description OrderBy 通过给定的字段进行升序 降序 排序 OrderByDescending 通过给定字段进行降序排序,仅在方法查询中使用 Then ...
- LINQ 学习路程 -- 查询操作 Deferred Execution of LINQ Query 延迟执行
延迟执行是指一个表达式的值延迟获取,知道它的值真正用到. 当你用foreach循环时,表达式才真正的执行. 延迟执行有个最重要的好处:它总是给你最新的数据 实现延迟运行 你可以使用yield关键字实现 ...
- LINQ 学习路程 -- 查询操作 Aggregate
聚合操作执行数学的运算,如平均数.合计.总数.最大值.最小值 Method Description Aggregate 在集合上执行自定义聚集操作 Average 求平均数 Count 求集合的总数 ...
- LINQ 学习路程 -- 查询操作 Join
Join操作是将两个集合联合 Joining Operators Usage Join 将两个序列连接并返回结果集 GroupJoin 根据key将两个序列连接返回,像是SQL中的Left Join ...
- LINQ 学习路程 -- 查询操作 where
1.where Filtering Operators Description Where Returns values from the collection based on a predicat ...
- LINQ 学习路程 -- 查询操作 GroupBy ToLookUp
Grouping Operators Description GroupBy GroupBy操作返回根据一些键值进行分组,每组代表IGrouping<TKey,TElement>对象 To ...
- LINQ 学习路程 -- 查询操作 let into关键字
IList<Student> studentList = new List<Student>() { , StudentName = } , , StudentName = } ...
- LINQ 学习路程 -- 查询操作 Select, SelectMany
IList<Student> studentList = new List<Student>() { , StudentName = "John" }, , ...
- LINQ 学习路程 -- 查询操作 OfType
OfType操作根据集合中的元素是否是给定的类型进行筛选 IList mixedList = new ArrayList(); mixedList.Add(); mixedList.Add(" ...
随机推荐
- IDC机房带宽突然暴涨问题!
IDC机房带宽突然暴涨问题! 1[提出问题] [实际案例一] 凌晨3:00点某公司(网站业务)的一个IDC机房带宽流量突然从平时高峰期150M猛增至1000M,如下图: 该故障的影响:直接导致数百台服 ...
- MySQL:习题(单表多条件查询二)
Sutdent表的定义 字段名 字段描述 数据类型 主键 外键 非空 唯一 自增 Id 学号 INT(10) 是 否 是 是 是 Name 姓名 VARCHAR(20) 否 否 是 否 否 Sex 性 ...
- java编写socket使用bufferedReader.readLine()问题研究
不写java代码好久,临时写个socket通讯竟然失败,郁闷之下仔细研究了下. 客户端使用BufferedReader来读取数据,在while中调用BufferedReader.readLine()函 ...
- MS coco数据集下载
2017年12月02日 23:12:11 阅读数:10411 登录ms-co-co数据集官网,一直不能进入,FQ之后开看到下载链接.有了下载链接下载还是很快的,在我这儿晚上下载,速度能达到7M/s,所 ...
- 基于树莓派3B+Python3.5的OpenCV3.4的配置教程
https://www.cnblogs.com/Pyrokine/p/8921285.html
- 【ubantu】Ubuntu的一些常用命令
创建文件: touch a.txt 创建文件夹: mkdir NewFolder 删除文件: rm a.txt 删除文件夹: rmdir NewFolder 删除带有文件的文件夹: rm -rf Ne ...
- onInterceptTouchEvent和onTouchEvent调用时序(转)
onInterceptTouchEvent和onTouchEvent调用时序 onInterceptTouchEvent()是ViewGroup的一个方法,目的是在系统向该ViewGroup及其各个c ...
- Unity中surfaceShader的处理机制和finalColor
http://blog.csdn.net/swj524152416/article/details/52945375
- windows下php配置redis
方法/步骤 1.使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本 2.根据PHP版本号,编译器版本号和CPU架构, 选择php_redis-2.2.5-5.5-ts-vc11- ...
- 仿照ArrayList自己生成的MyList对象
现在需要自己生成一个list集合,基本雷同ArrayList,不使用API的List接口. 实现如下: MyList的代码: public class MyList<T> { privat ...