zoukankan      html  css  js  c++  java
  • LINQ 学习路程 -- 查询操作 Expression Tree

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

    表达式树可以表示一个数学公式如:x<y。x、<、y都是一个表达式,并构成树形的数据结构

    表达式树使lambda表达式的结构变得透明清楚,

    Expression<Func<Student, bool>> isTeenAgerExpr = s => s.age > 12 && s.age < 20;

    编译器将上面的表达式翻译成下面的表达式树

    Expression.Lambda<Func<Student, bool>>(
                    Expression.AndAlso(
                        Expression.GreaterThan(Expression.Property(pe, "Age"), Expression.Constant(12, typeof(int))),
                        Expression.LessThan(Expression.Property(pe, "Age"), Expression.Constant(20, typeof(int)))),
                            new[] { pe });

    你可以手动创建一个表达式树,如下

    Func<Student, bool> isAdult = s => s.age >= 18;

    1.先创建参数节点

    ParameterExpression pe = Expression.Parameter(typeof(Student), "s");

    2.再创建属性节点

    MemberExpression me = Expression.Property(pe, "Age");

    3.再创建常量表达式节点

    ConstantExpression constant = Expression.Constant(18, 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 >= 18
                select s;

    它将被翻译成SQL语句,然后在数据库服务器上运行

    一个查询表达式被翻译成SQL语句,作为一个字符串传递给另一个程序,例如LINQ-to-SQL或EntityFramework,将在数据库服务器上运行

    很明显,将表达式树翻译成SQL语句比将IL代码翻译成SQL语句更容易。

    很容易的从表达式树中获取信息

    Queryable静态类中包含一些扩展方法接收一个Expression类型的参数,该参数将被转换成表达式树,作为数据结构传递给LINQ提供者,提供者将表达式创建成适当的查询语句并执行

  • 相关阅读:
    【20171123】【GITC精华演讲】贝业新兄弟李济宏:如何做到企业信息化建设的加减乘除
    920记者招待会: 对话详解海尔张瑞敏首席的人单合一
    存货控制中的ABC分类释义
    对员工宽容的公司 都死掉了
    小型互联网公司的IT系统建设思路
    第三方物流是什么
    伟哥对RTO & RPO的通俗理解
    【20170506】贝业新兄弟IT总监李济宏:第三方家居物流的IT架构探索
    【Vegas原创】VirtualBox扩容、分割的整体方案
    数据通信基础(物理层)学习笔记
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/6616659.html
Copyright © 2011-2022 走看看