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提供者,提供者将表达式创建成适当的查询语句并执行

  • 相关阅读:
    买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791
    asp.net cookie and session
    leelazero and google colab
    download file by python in google colab
    physical processor, core, logical processor
    通过powershell操作eventlog
    openxml in sql server
    get the page name from url
    How to Execute Page_Load() in Page's Base Class?
    Difference between HttpContext.Request and Request
  • 原文地址:https://www.cnblogs.com/lanpingwang/p/6616659.html
Copyright © 2011-2022 走看看