C#高级编程(第9版) 第11章 LINQ 笔记
概述
语言集成查询(Language Integrated Query, LINQ)在C#编程语言中集成了查询语法,可以用相同的语法访问不同的数据源。
LINQ提供了不同数据源的抽象层,所以可以使用相同的语法。
本章介绍LINQ的核心原理和C#中支持C#LINQ查询的语言扩展。
列表和实体
LINQ查询
eg:
var query = from r inFormua1.GetChampions()
where r.Country == "Brazil"
orderby r.wins descending
select r;
子句form、where、orderby、descending和select都是这个查询中预定义的关键字。
查询表达式必须以from子句开头,以select或group子句结尾。这两个子句之间,可以使用where、orderby、join、let和其它from子句。
query变量只是制定了LINQ查询。该查询不是通过这个赋值语句执行的。只要使用foreach循环访问查询,该查询就会执行。
扩展方法
编译器会转换LINQ查询,以调用方法而不是LINQ查询。
LINQ为IEnumerable<T>接口提供了各种扩展方法,以便用户实现了该接口的任意集合上使用LINQ查询。
扩展方法可以将方法写入最初没有提供该方法的类中。还可以把方法添加到实现某个特定接口的任何类中,这样多个类就可以使用相同的实现代码。
定义LINQ扩展方法的一个类是System.Linq命名空间中的Enumerable。只需要导入这个命名空间,就打开了这个类的扩展方法的作用域。
推迟查询和执行
在运行期间定义查询表达式时,查询就不会运行,查询会在迭代数据项时运行。
扩展方法Where()使用yield return语句返回谓词为true的元素。因为使用了yield return语句,所以编译器会创建一个枚举器,在访问枚举中的项后,就返回它们
标准的查询操作符
下表列出了Enumerable类定义的标准查询操作符:




筛选
并不是所有的查询都可以用LINQ查询方法完成。也不是所有的扩展方法都映射到LINQ查询子句上。
高级查询使用扩展方法。
用索引筛选
不能使用LINQ查询的一个例子是Where()方法的重载。
在Where()方法的重载中,可以传递第二个参数 ----- 索引。
索引是筛选器返回的每个结果的计数器。
类型筛选
可以使用OfType()扩展方法,基于类型进行筛选。
复合的from子句
C#编译器把复合的from子句和LINQ查询转换为SelectMany()方法。
排序
分组
对嵌套的对象分组
内连接
左外连接
组连接
结合操作
合并
分区
聚合操作符
转换操作符
生成操作符
并行LINQ
System.Linq命名空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上。
尽管Enumerable类给IEnumerable<T>接口定义了扩展方法,但ParallelEnumerable类的大多数扩展方法是ParallelQuery<TSource>类的扩展。
并行查询
分区器
取消
表达式树
在LINQ to Objects中,扩展方法需要将一个委托类型作为参数,这样就可以将lambda表达式赋予参数。lambda表达式也可以赋予Expression<T>类型的参数。C#编译器根据类型给lambda表达式定义不同的行为。如果类型是Expression<T>,编译器就从lambda表达式中创建一个表达式数,并存储在程序集中。这样,就可以在运行期间分析表达式树,并进行优化,以便于查询数据源。
LINQ提供程序
.NET包含几个LINQ提供程序。
LINQ提供程序为特定的数据源实现了标准的查询操作符。
小结
本章讨论了LINQ查询和查询所基于的语言结构,如扩展方法和lambda表达式,还列出了各种LINQ查询操作符,不仅用于筛选数据源,给数据源排序,还用于执行分区、分组、转换、连接等操作。
使用并行LINQ可以轻松地并行化运行时间较长的查询。
另一个重要的概念是表达式树。
表达式树允许在运行期间构建对数据源的查询,因为表达式树存储在程序集中。
还可以下载其它第三方提供程序,例如: LINQ to MySQL、LINQ to Amazon、LINQ to Flickr、LINQ to LDAP和LINQ to SharePoint等。无论使用什么数据源,都可以通过LINQ使用相同的查询语法进行操作。
C#高级编程(第9版) 第11章 LINQ 笔记的更多相关文章
- 【转】apue《UNIX环境高级编程第三版》第一章答案详解
原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...
- C#高级编程 (第六版) 学习 第二章:C#基础
第二章 基础 1,helloworld示例: helloworld.cs using System; using System.Collections.Generic; using System.Li ...
- C#高级编程 (第六版) 学习 第一章:.Net体系结构
第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...
- ASP.NET MVC 4高级编程(第4版)
<ASP.NET MVC 4高级编程(第4版)> 基本信息 作者: (美)Jon Galloway Phil Haack Brad Wilson K. Scott All ...
- 《UNIX环境高级编程(第3版)》
<UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...
- Linux - Unix环境高级编程(第三版) 代码编译
Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...
- C#高级编程第9版 阅读笔记(一)
一.前言 C# 简洁.类型安全的面向对象的语言. .NET是一种在windows平台上编程的架构——一种API. C#是一种从头开始设计的用于.NET的语言,他可以利用.NET Framework及其 ...
- Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题
学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...
- c#高级编程第七版 学习笔记 第一章 .NET体系结构
第一章 .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...
随机推荐
- 容器STL
一.迭代器iterator 迭代器是容器的一种遍历方式,每种容器都定义了自己的迭代器类型 声明一个迭代器: 容器名称<数据类型>::iterator 迭代器名称 vector<int ...
- CodeForces - 869B The Eternal Immortality
题意:已知a,b,求的最后一位. 分析: 1.若b-a>=5,则尾数一定为0,因为连续5个数的尾数要么同时包括一个5和一个偶数,要么包括一个0. 2.若b-a<5,直接暴力求即可. #in ...
- 用 k8s 运行一次性任务【转】
容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序,完成后容 ...
- centos下离线安装zip和unzip
首先如果你的centos可以联网,那可以不用看了,直接yum install -y zip unzip就行,非常的痛快! 如果不能联网,像我一样,只能用vpn连上去,做了点限制.那就非常烦了,yum了 ...
- SpringBoot#应用启动后执行某些逻辑
// 方式1 @Component public class WhenStartupA implements InitializingBean { @Override public void afte ...
- 利用pandas,处理每天的点名。。
学以致用,,最近的疫情,导致每天都要向学校汇报班上同学的情况,可是每次提交的人总是慢半拍,为了快速找出谁还没有提交检查表,利用最近学的知识,快速检查提交名单.方便你我他. 上代码: import pa ...
- C++连接sqlite数据库的坑
新的第一次用vs2013搞 C++连接sqlite数据库,遇到了很多问题,我也不搞不懂~~~下面写点小体会 首先: 你要先配置好sqlite的环境 参考链接: https://blog.csdn.ne ...
- 学会C#
一.字符串插值 (String Interpolation) C# 6之前我们拼接字符串时需要这样 var Name = "Jack"; var results = "H ...
- 吴裕雄--天生自然java开发常用类库学习笔记:比较器
class Student implements Comparable<Student> { // 指定类型为Student private String name ; private i ...
- Mac安装软件提示破损
安装提示破损 zhong终端输入 sudo spctl --master-disable 就可以顺利打开啦