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)的优点 值 ...
随机推荐
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:"text-primary" 类的文本样式
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- SciPy 输入输出
章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...
- ModelSim安装步骤
刚成功安装了软件的我反手就是一篇安装步骤分享. 这是我自己创建的永久百度云链接. ModelSim10.7软件下载百度云链接 网址:https://pan.baidu.com/s/14oGZytocA ...
- 深入 理解char * ,char ** ,char a[ ] ,char *a[] 的区别
转自:https://blog.csdn.net/liusicheng2008_liu/article/details/80412586 1 数组的本质 数组是多个元素的集合,在内存中分布在地址相连的 ...
- ROS常用库(三)API学习之常用common_msgs(上)
一.概述 common_msgs包含其他ROS软件包广泛使用的消息.这些消息包括动作消息(actionlib_msgs),诊断消息(diagnostic_msgs),几何图元(geometry_msg ...
- 解题报告:luogu P3853 [TJOI2007]路标设置
题目链接:P3853 [TJOI2007]路标设置 是个水二分,那你还\(WA\).很简单,就是练了练和早上那题相似的题. 二分答案即可,复杂度\(O(Nlogl)\),可以通过本题. 不过,需要注意 ...
- hello程序的运行过程-从计算机系统角度
hello程序的运行过程-从计算机系统角度 1.gcc编译器驱动程序读取源程序文件hello.c,并将它翻译成一个可执行目标文件hello.翻译过程分为四个阶段:预处理阶段,编译阶段,汇编阶段,链接阶 ...
- haproxy+keepalive双主高可用实现负载均衡
转载自https://blog.51cto.com/3381847248/1977073 前面我已经介绍了haproxy结合keepalive做简单的双主高可用,如果不清楚的话,可以去我的上一 篇博客 ...
- InvalidOperationException: Cannot create a DbSet for 'IdentityUserClaim<string>' because this type is not included in the model for the context.
An unhandled exception occurred while processing the request. InvalidOperationException: Cannot crea ...
- 用 Python 分析网易严选 Bra 销售信息,告诉你她们真实的 Size
今天通过爬虫数据进行分析,一起来看看网易严选商品评论的获取和分析. 声明:这是一篇超级严肃的技术文章,请本着学习交流的态度阅读,谢谢! ! 网易商品评论爬取 分析网页 评论分析 进入到网易严选 ...