zoukankan      html  css  js  c++  java
  • (转)初识LINQ中的Expression表达式树

    lambda表达式赋给委托就生成IL代码,赋给Expression<TDelegate>就是表达式 ,Expression<TDelegate> .complie()又可以生成中间代码

    表达式就是一个抽象语法树,用来表示一段经过解析的代码,编译器和解释器将在进行代码优化及代码生成时使用到抽象语法树,便于其他代码对表达式进行分析,并做一些操作,如linq to sql中使用表达式生成sql 语句。

    在.NET3.0之后,可以使用LINQ表达式,即from a in set where a.x == y select a之类的表达,实质就是编译器对IQueryable对象提供的特定的关键词支持。

    具体可以参考《System.Linq.Expressions 命名空间》《Building LINQ Queries at Runtime in C#》

    在 LINQ 中,表达式树用于表示针对数据源的结构化查询,这些数据源实现 IQueryable(Of T)。例如,LINQ to SQL 提供程序实现IQueryable(Of T) 接口,用于查询关系数据存储。C# 和 Visual Basic 编译器会将针对此类数据源的查询编译为代码,该代码在运行时将生成一个表达式树。然后,查询提供程序可以遍历表达式树数据结构,并将其转换为适合于数据源的查询语言。表达式树还可以用在 LINQ 中,用于表示分配给类型为 Expression(Of TDelegate) 的变量的 Lambda 表达式。表达式树还可用于创建动态 LINQ 查询。有关更多信息,请参见如何:使用表达式树来生成动态查询。如果要生成 LINQ 提供程序,您也可以使用表达式树。

    在LINQ中,我们使用LINQ查询表达式来从数据库中获取数据,很显示,数据库并不认识LINQ语法,它只认识SQL语句,这时表达式树就派上用场了,它将LINQ查询表达式解析成一个数据结构,再对数据结构进行分析,进而组合成SQL数据库需要的SQL语句。

    简单例子1:

       1:  using System.Linq.Expressions;
       2:   
       3:  Expression<Func<Student, bool>> expression = r => r.Graduate == 1 && r.Name == "Jacky";
       4:  Func<Student, bool> d = expression.Compile();
       5:  bool result = d(new Student { Name = "Tummy", Graduate = 2 });
       6:  Console.WriteLine(result + " -- this is linq expression result");

    简单例子2:

       1:  static void RaiseSomePropChanged<T>(Expression<Func<T>> propertyExpression)
       2:  {
       3:           Func<T> d = propertyExpression.Compile();
       4:           T result = d();
       5:           Console.WriteLine(result );
       6:   }
       7:   
       8:  RaiseSomePropChanged(() => "abc");

  • 相关阅读:
    C#线程类Thread初步
    无限级分类存储过程版
    C#多线程编程实例实战
    数据库里阻塞和死锁情况 看那里死锁的存储过程
    预防按钮的多次点击 恶意刷新
    .net2.0文件压缩/解压缩
    HttpHandler和HttpModule入门
    反射,枚举,绑定下拉框
    在C#里关于定时器类
    判断上传的图片文件格式是否合法不是用后缀做的判断
  • 原文地址:https://www.cnblogs.com/liangouyang/p/4654877.html
Copyright © 2011-2022 走看看