Linq有很多值得学习的地方,这里我们主要介绍Linq lambda表达式,包括介绍Expression tree等方面。

Linq lambda表达式

了解过C# 3.0的新特性的话应该知道,在C# 3.0中新引入了一个语法结构,称为lambda expression(Linq lambda表达式/匿名函数)。对此尚不了解的也可以到MSDN上看看,Linq lambda表达式。Linq lambda表达式既可以赋值给一个委托(delegate)类型,例如Action、Func等系列的内建委托类型;也可以赋值给Expression类型,例如以下Linq lambda表达式:

  1. x => -x

当它被直接赋值给Func<int, int="">类型的变量时,C#编译器会将它的内容编译为一个静态方法,并创建一个对应类型的引用赋值给变量。

  1. static class Program {
  2. static void Main( string[ ] args ) {
  3. Func<int, int> negateFunc = x => -x;
  4. }
  5. }

C#编译器会编译为类似下面的代码:

  1. internal static class Program
  2. [CompilerGenerated]
  3. private static int <Main>b__0( int x ) {
  4. return -x;
  5. }
  6. private static void Main( string[ ] args ) {
  7. Func<int, int> negateFunc = new Func<int, int>( <Main>b__0 );
  8. }
  9. }

(实际上还涉及到缓存那个委托,这里省略掉了。另外,之所以会编译为一个静态方法是因为这个Linq lambda表达式没有使用任何“自由变量”,也就是既不是参数或局部变量也不是类的成员的变量。在现有的C#编译器实现中,如果一个匿名函数使用了“this”,那么对应生成的方法会是成员方法;如果使用了其它自由变量的话则会生成一个私有内部类来存放匿名函数所使用到的自由变量,并在这个内部类里生成匿名函数对应的方法。这里作为例子选择了最简单的情况来介绍。)

如此将一个Linq lambda表达式编译为一个实际的函数后,其中的MSIL字节码可以为CLR所理解并执行。这样就足够实现in-memory query了,例如LINQ-to-Objects、LINQ-to-DataSet等。但其它平台无法理解MSIL,要对函数进行分析然后执行就会十分困难。例如说,如果想让一个Linq lambda表达式在SQL Server上执行,该如何让SQL Server也理解它呢?

Expression tree与Linq lambda表达式

MSIL之所以不便于分析是因为它将原本是树状结构的程序代码转换为了线性结构,损失了一些信息,主要是损失了程序代码的“结构性”,更接近于底层而降低了抽象程度。
我们知道,程序源代码对应着具体语法树(concrete syntax tree),每个叶节点对应着代码里的一个词素,其上则是各种语法结构,如表达式、语句、声明、定义等。抽象语法树(abstract syntax tree,AST)则在具体语法树的基础上将一些诸如关键字、括号等冗余信息去掉,让树更加整洁,便于分析而不损失任何有用的信息。

转载于:https://www.cnblogs.com/Peter-Luo/archive/2012/05/31/2528958.html

Linq lambda表达式经验总结相关推荐

  1. LinQ—Lambda表达式

    概述 本篇博客主要解说lambda表达式,在这里将它的来龙去脉,主要是从托付,匿名函数这些方面过度讲的,当然,在讲托付和匿名函数的时候,主要是从Lambda的角度出发讲的,可能它们还具有其他的一些作用 ...

  2. Linq之Lambda表达式初步认识

    目录 写在前面 匿名方法 一个例子 Lambda 定义 一个例子 总结 参考文章 写在前面 元旦三天在家闲着无事,就看了看Linq的相关内容,也准备系统的学习一下,作为学习Linq的前奏,还是先得说说 ...

  3. SQL、Linq和Lambda表达式 的关系

    首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询 ...

  4. Db4o结合Linq、Lambda表达式的简单示例

    大多数人接触Db4o的查询,都是从"样本查询"(Query by Example)开始的,这种查询方式简单但不方便,功能和性能也很受局限.以下是引自官方的样本查询示例: // re ...

  5. Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式

    当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...

  6. 用c#算成绩的总和_C# 基础知识系列- 6 Lambda表达式和Linq简单介绍

    前言 C#的lambda和Linq可以说是一大亮点,C#的Lambda无处不在,Linq在数据查询上也有着举足轻重的地位. 那么什么是Linq呢,Linq是 Language Intergrated ...

  7. Linq、Lambda表达式详细总结(转)

    (一)输入参数 在Lambda表达式中,输入参数是Lambda运算符的 左边部分.它包含参数的数量可以为0.1或者多个.只有当输入参数为1时,Lambda表达式左边的一对小括弧才可以省略.输入参数的数 ...

  8. C#——《C#语言程序设计》实验报告——综合练习——委托、Lambda表达式、LINQ、接口

    问题描述 1.使用委托.Lambda表达式.LINQ等知识完成以下内容:(本题35分) (1)要求定义Employee类,带有Name属性(string类型),带有Birthday属性(DateTim ...

  9. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

最新文章

  1. 一个或多个实体的验证失败。 有关更多详细信息,请参见“ EntityValidationErrors”属性
  2. c语言tcp硬时事通讯程序代码,使用C语言编写基于TCP协议的Socket通讯程序实例分享...
  3. 大专学完出来学计算机,浙江2021年计算机学校读出来是什么文凭
  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包
  5. android捕获线程异常,android - 终结器引发的未捕获的异常:所有WebView方法必须在同一线程上调用。 (预期的Looper) - 堆栈内存溢出...
  6. Hibernate之工具类HibernateUtil
  7. try.dot.net 的正确使用姿势
  8. 服务器位置设置在哪里找,服务器主页在哪里设置方法
  9. liquibase mysql_Liquibase MySQL:语法错误附近'????????????????'
  10. Check Point在Google Play上发现大批感染Judy恶意软件的应用
  11. lisp 所在图幅号计算_图幅编号的计算
  12. 查看编译class文件时,使用的JDK版本(只能查看到大版本)
  13. 线报天下免费补丁,使用补丁可解锁全部线报
  14. 华为HCNA认证---简介及资源
  15. 收银怎样挂单和取单_挂单取单(PC收银)
  16. 【MOOC】华中科技大学计算机组成原理慕课答案-第二章-数据表示
  17. excel中实现多条件去重计数
  18. 分群思维(六)分群思维的顶层应用-用户画像
  19. Win10 21H1发布后的首个更新上线 包含大量的修复内容
  20. 怎样改变照片大小?免费在线图片压缩方法

热门文章

  1. TensorFlow GPU配置
  2. 线性代数 矩阵消元与回代
  3. Oracle归档日志管理
  4. win7查看tomcat端口_想研究Tomcat性能调优,看这篇就够了
  5. debian9.4配置iso作为更新源
  6. Vmware和Citrix各自发展史
  7. Java设计模式学习总结(16)——行为型模式之命令模式
  8. 敏捷开发系列学习总结(15)——Spotify敏捷模式详解三部曲第三篇:工程文化
  9. Spring学习总结(28)——Spring获取request对象的几种方法及线程安全性总结
  10. Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群