概述
语言集成查询(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 笔记的更多相关文章

  1. 【转】apue《UNIX环境高级编程第三版》第一章答案详解

    原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...

  2. C#高级编程 (第六版) 学习 第二章:C#基础

    第二章 基础 1,helloworld示例: helloworld.cs using System; using System.Collections.Generic; using System.Li ...

  3. C#高级编程 (第六版) 学习 第一章:.Net体系结构

    第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...

  4. ASP.NET MVC 4高级编程(第4版)

    <ASP.NET MVC 4高级编程(第4版)> 基本信息 作者: (美)Jon Galloway    Phil Haack    Brad Wilson    K. Scott All ...

  5. 《UNIX环境高级编程(第3版)》

    <UNIX环境高级编程(第3版)> 基本信息 原书名:Advanced Programming in the UNIX Environment (3rd Edition) (Addison ...

  6. Linux - Unix环境高级编程(第三版) 代码编译

    Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...

  7. C#高级编程第9版 阅读笔记(一)

    一.前言 C# 简洁.类型安全的面向对象的语言. .NET是一种在windows平台上编程的架构——一种API. C#是一种从头开始设计的用于.NET的语言,他可以利用.NET Framework及其 ...

  8. Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题

    学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...

  9. c#高级编程第七版 学习笔记 第一章 .NET体系结构

    第一章      .NET体系结构 本章内容: 编译和运行面向.NET的代码 Microsoft中间语言(Microsoft Intermediate Language,MSIL或简称IL)的优点 值 ...

随机推荐

  1. redis的基本操作

    redis是key-value的数据结构,每条数据都是⼀个键值对 键的类型是字符串 注意:键不能重复 值的类型分为五种: 字符串string 哈希hash 列表list 集合set 有序集合zset ...

  2. NodeJs koa2实现文件上传

    [转载自:]https://www.jianshu.com/p/34d0e1a5ac70 知识讲解 koa2框架是一个基于中间件的框架,也就是说,需要使用到的功能,比如路由(koa-router),日 ...

  3. HDU 3065 病毒侵袭持续中 (模板题)

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  4. OpenJ_Bailian - 1088 滑雪(记忆化搜索)

    题意:给定一个二维数组,一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小,输出可以滑行的最长区域的长度. 分析:对于每一个点,进行记忆化搜索.若某点可以向四周某几个点滑行,记忆化搜索求出 ...

  5. 该虚拟机似乎正在使用中 如果该虚拟机未在使用请按获取所权T按钮获取他的所有权,否则,请按取消按钮以防损坏

    虚拟机出现如下情况 不能够正常过使用,解决办法如下:直接进入上图中配置文件的目录下,然后删除所有的lck结尾的文件夹,然后重新启动, 然后file打开这个文件即可.重新进入虚拟机开机.

  6. ThinkCMF框架上的任意内容包含漏洞

    一.背景 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建. ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据 ...

  7. 微信小程序自定义组件-下拉框

    这个是网址https://www.cnblogs.com/zjjDaily/p/9548433.html 微信小程序之自定义select下拉选项框组件 知识点:组件,animation,获取当前点击元 ...

  8. 云时代架构阅读笔记十五——之前碰到的Java面试题

    1.一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致. 2.Java有 ...

  9. Python 3.8 新功能【新手必学】

       Python 3.8 是 Python 编程语言的最新主要版本, 它包含许多新功能和优化.   Python 3.8 Python 3.8 的一些新功能包括: 1. 海象运算符   PS:很多人 ...

  10. 新闻类网站的通用爬虫--GNE

    GNE(GeneralNewsExtractor)是一个通用新闻网站正文抽取模块,输入一篇新闻网页的 HTML, 输出正文内容.标题.作者.发布时间.正文中的图片地址和正文所在的标签源代码.GNE在提 ...