• 【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提供程序就可以读取表达式,创建一个运行期间优化的查询,从数据库中获取数据。

  • 相关阅读:
    drf 权限流程解析
    drf 认证流程解析
    drf 版本解析
    Django REST framework初识
    RESTful规范
    Flask框架
    Flask框架解析目录
    hdu
    hdu 6113 度度熊的01世界(结构体的赋值问题)
    hdu 6114 chess(排列组合)
  • 原文地址:https://www.cnblogs.com/SignX/p/11509652.html
Copyright © 2020-2023  润新知