【c#基础】表达式树

在Linq to Objects中,扩展方法需要将一个委托类型作为参数,这样就可以将lambda表达式赋予参数。lambda表达式也可以赋予Expression<T>类型的参数。

c#编译器根据类型给lambda表达式定义不同的行为。如果类型是Expression<T>,编译器就从lambda表达式中创建一个表达式树,并存储在程序中。这样,就可以在运行期间分析表达式树,并进行优化,以便于查询数据源。

Enumerable类不是唯一一个定义了扩展方法的Where()类,Queryable<T>类也定义了Where扩展方法。区别是Enumerable类是一个委托类型Fun<T,bool>作为参数谓词,Queryable<T>类是用Expreesion<T>作为类型。

Expression表达式

//委托类型
Func<Racer,bool> predicate=r=>r.Country=="Brazil";
//表达式树类型
Expression<Func<Racer,bool>> prdeicate=r=>r.Country=="Brazil"

除了使委托外,编译器还会把表达式树放在程序集中。表达式可以在运行期间读取。

表达式树从派生自抽象基类Expression的类中构件。Expression类与Expression<T>不同。继承自

Expression类的表达式类有BinaryExpression、ConstantExpression、InvocationExpression、lambdaExpression、NewExpression、NewArrayExpression、TemaryExpression以及Unary Expression等。编译器会从lambda表达式中创建表达式树。

例如,lambda表达式r.Country=="Brazil"使用了ParameterExpression、MemberExpression、ConstantExpression和MethodCallExpression,来创建一个表达式树。并将该树存储在程序集中。之后运行期间使用这个树,创建一个用于底层数据源的优化查询。

  DisplayTree()方法在控制台图形化地显示表达式树。其中传递了一个Expression对象。并根据表达式的类型,把表达式的一些信息写到控制台上。根据表达式的类型,递归地调用DisplayTree()方法。

  DisplayTree()方法没有处理所有的类型,处理的类型有ExpressionType.Lambda、ExpressionType.Constant、ExpressionType.Parameter、ExpressionType.Equal、ExpressionType.AndAlso、ExpressionType.GreaterThan、ExpressionType.MemberAccess、

  使用Expression<T>类型的一个例子是ADO.NET Entity Framework和WCF数据服务的客户端提供程序。这些技术用Expression<T>参数定义了扩展方法,这样,访问数据库的Linq提供程序就可以读取表达式,创建一个运行期间优化的查询,从数据库中获取数据。

原文地址:https://www.cnblogs.com/SignX/p/11509652.html

时间: 2024-10-11 06:51:55

【c#基础】表达式树的相关文章

C#高级编程六十六天----表达式树总结

表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是很有用的.有其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 表达式树的语法: 考虑下面简单的Lambda表达式: Func<int,int,int>function=(a,b)=>a+b; 这个语法包含三个部分: 1.一个声明 : Func<int,int,int>function 2.一个等号 : =

C#高级编程六十六天----表达式树总结【转】

https://blog.csdn.net/shanyongxu/article/details/47257139 表达式树总结 基础 表达式树提供了一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是很有用的.有其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 表达式树的语法: 考虑下面简单的Lambda表达式: Func<int,int,int>function=(a,b)=>a+b; 这个语法包

表达式树基础代码

using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Linq.Expressions; namespace TestExpressionLambda { class ProgramExpression { static void Main(st

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如

Lambda表达式和表达式树

在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在不牺牲可读性的前提下,进一步简化了委托. LINQ的基本功能就是创建操作管道,以及这些操作需要的任何状态.这些操作表示了各种关于数据的逻辑,例如数据筛选,数据排序等等.通常这些操作都是用委托来表示.Lambda表达式是对LINQ数据操作的一种符合语言习惯的表示方式. Lambda表达式不仅可以用来创

转载:C#特性-表达式树

原文地址:http://www.cnblogs.com/tianfan/ 表达式树基础 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通的LINQ知识便可以轻松理解本文. 表达式树提供一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是非常有价值的.尤其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 但是我在这里颠倒顺序,在文章最后你很容易发现为

C#特性-表达式树

表达式树ExpressionTree 表达式树基础 转载需注明出处:http://www.cnblogs.com/tianfan/ 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通的LINQ知识便可以轻松理解本文. 表达式树提供一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是非常有价值的.尤其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 但

什么是表达式树,它与表达式、委托有什么区别?

序言 首先,需要普及下基础知识: Expression我们称之为:表达式树, 而Func<>或者Action 称之为:匿名委托,Func与Action的区别是Func带返回值(至少一个参数),Action不带返回值(可以没有任何参数). 以上的关键词是在.net 3.5之后出现的,配合Linq中Lambda使用. 当然Expression还可以动态的进行构造它,而不使用Lambda表达式来定义. 什么是表达式树 它是一种数据结构体,用于存储需要计算.运算的一种结构.这种结构可以只是”存储“,而

表达式树ExpressionTree

表达式树基础 转载需注明出处:http://www.cnblogs.com/tianfan/ 刚接触LINQ的人往往觉得表达式树很不容易理解.通过这篇文章我希望大家看到它其实并不像想象中那么难.您只要有普通的LINQ知识便可以轻松理解本文. 表达式树提供一个将可执行代码转换成数据的方法.如果你要在执行代码之前修改或转换此代码,那么它是非常有价值的.尤其是当你要将C#代码----如LINQ查询表达式转换成其他代码在另一个程序----如SQL数据库里操作它. 但是我在这里颠倒顺序,在文章最后你很容易