linq总结系列(二)---Expression

一、linq中的表达式和表达式树

  Linq中的表达式(Expression<TDel>)是强类型的lambda表达式,对Func和Action形式的委托做了一层封装。

  lambda表达式的本质是简写的匿名函数,可以赋值给Func或Action类型的委托,在.net中被编译成可执行的代码;lambda表达式赋值给Expression<TDel>>,.net将其转换成表达式树。

什么是表达式树:

  表达式树是表达式的内存表示,保存了表达式的数据结构。如我们查询年龄大于18岁的学生,使用lambda表达式为stu=>stu.Age>18,这个表达式会被.net转化成一棵表达式树:树的每一个节点都是一个表达式,如输入参数stu用ParameterExpression表示,18用ConstantExpression表示,具体如下图(图片来源:http://www.yuanjiaocheng.net/Linq/linq-expression-tree.html)

二、使用表达式树的好处

  表达式树是完全透明的,方便了解参数和功能(EF中的Linq to Sql要把linq语句转化成sql语句,lambda赋值给Func或者Action,其被转换成可执行代码,要把可执行代码转换成Sql很不方便,如果把lambda赋值给Expression,程序很方便的通过表达式树获取数据结构,从而使转换sql时变得方便)

 三、总结

linq中的表达式是对Func和Action形式的委托做了一层封装,在内存中以表达式数形式存储,这种存储方式数据结构明了,有利于进行Linq to XXX查询(如很容易将linq转成sql)。还有一点linq查询默认都是延迟加载的,只有使用结果时才执行真正的查询操作(如 在执行first,last,single,count,ToList,toXXX时才进行真正的查询),这种设计将查询的方式和查询的执行进行了 解耦,使得我们可以将查询方法分成多个步骤来创建,linq表达式的保存这些查询方法(就是封装的委托),在我们需要使用查询结果时,通过一个完整的方法(linq表达式组合在一起)去查询,减少了对集合的查询次数,这种特性对数据库查询很有利。(如我们在进行用户和用户角色联合查询时,先获取IEnumerable<User>和IEnumerable<Role>,在通过Linq的联结查询获取结果,其实只查了一次数据库)。

原文地址:https://www.cnblogs.com/wyy1234/p/9057140.html