标题：LINQ实战指南
基本信息
原书名：LINQ in Action
原出版社： Manning Publications
作者：(法)Fabrice Marguerie   (美) Steve Eichert   (美)Jim Wooley   译者：陈黎夫
丛书名： 图灵程序设计丛书 C#与.NET系列
出版社：人民邮电出版社
ISBN：9787115208514
出版日期：2009 年8月
开本：16开
页码：416
版次：1-1
编辑推荐
微软MVP呕心沥血之作，LINQ圣经.
深入全面，引人入胜.
丰富实例，兼顾C#和VB NET语言
内容简介
linq是微软 net软件开发平台上的一项突破性创新技术，它在面向对象语言与各种数据源之间架设了一座高效的桥梁，大大降低了软件开发的复杂度。
本书内容全面详细，几乎涵盖了所有技术要点。对于linq提供的各种特性，从客观的角度解释其优缺点，使读者能够根据具体情况做出选择。此外，还讲解了 linq的可扩展性，可用于更高级的数据处理。全书组织结构合理，行文流畅，使读者如同置身于一次技术旅行。在深入透彻的讲解中恰到好处地运用实例，对同一主题分别给出c#和vb net实例，并在实例的关键点给出注释，真正达到了化繁为简的境界。
本书适合于使用c# 和vb net 的软件开发者
目录
第一部分　从这里开始 
第1章　linq简介 2
1 1　linq是什么 2
1 1 1　概览 3
1 1 2　linq的功能 3
1 1 3　作为语言扩展的linq 4
1 2　为什么需要linq 6
1 2 1　常见问题 6
1 2 2　解决理念上的失调 8
1 2 3　linq给出解决方案 12
1 3　linq的设计目标及起源 13
1 3 1　linq项目的设计目标 13
1 3 2　一点历史 14
1 4　linq to objects初步：查询内存中的集合 15
1 4 1　先决条件 15
1 4 2　hello linq to objects 17
1 5　linq to xml初步：查询xml文档 20
1 5 1　为什么需要linq to xml 20
1 5 2　hello linq to xml 22
1 6　linq to sql初步：查询关系型数据库 26
1 6 1　linq to sql功能概览 26
1 6 2　hello linq to sql 26
1 6 3　进一步了解linq to sql 30
1 7　小结 30
第2章　c#和vb语言的增强特性 31
2 1　新语言的增强特性一瞥 31
2 1 1　列出当前正在运行的所有进程 32
2 1 2　将返回结果封装成类 33
2 2　隐式类型局部变量 34
2 2 1　语法 35
2 2 2　使用隐式类型局部变量改进实例程序 35
2 3　对象和集合的初始化器 37
2 3 1　引入对象初始化器的动机 37
2 3 2　集合初始化器 38
2 3 3　用对象初始化器改进实例程序 39
2 4　lambda表达式 40
2 4 1　委托回顾 40
2 4 2　匿名方法 42
2 4 3　lambda表达式介绍 42
2 5　扩展方法 47
2 5 1　创建扩展方法的示例 47
2 5 2　更多使用linq标准查询操作符的例子 50
2 5 3　将扩展方法引入到实例程序中 51
2 5 4　注意事项 52
2 6　匿名类型 54
2 6 1　使用匿名类型组合数据 55
2 6 2　没有名字的类型也是类型 55
2 6 3　使用匿名类型改进实例程序 56
2 6 4　匿名类型的限制 57
2 7　小结 58
第3章　linq构建块 61
3 1　linq对 net的扩展 61
3 1 1　语言扩展回顾 61
3 1 2　构成linq基础的核心元素 62
3 2　序列 63
3 2 1　ienumerable(t)接口 63
3 2 2　迭代器回顾 64
3 2 3　延迟查询执行 66
3 3　查询操作符 69
3 3 1　查询操作符是什么 69
3 3 2　标准查询操作符 71
3 4　查询表达式 72
3 4 1　查询表达式是什么 72
3 4 2　编写查询表达式 73
3 4 3　标准查询操作符与查询表达式的关系 75
3 4 4　限制 76
3 5　表达式树 78
3 5 1　lambda表达式回顾 78
3 5 2　表达式树是什么 78
3 5 3　iqueryable，另一种实现延迟查询执行的方法 81
3 6　linq的程序集以及命名空间 81
3 7　小结 83
第二部分　查询内存中的对象
第4章　熟悉linq to objects 86
4 1　实例程序简介 86
4 1 1　程序目标 86
4 1 2　程序功能 87
4 1 3　业务逻辑实体 87
4 1 4　数据库架构 87
4 1 5　示例数据 89
4 2　用linq操作内存中的集合 90
4 2 1　能够查询什么 90
4 2 2　支持的操作 94
4 3　在asp net和windows forms中使用linq 95
4 3 1　web应用程序中的数据绑定 95
4 3 2　windows forms应用程序中的数据绑定 100
4 4　常用的标准查询操作符 103
4 4 1　约束操作符where 104
4 4 2　投影操作符 105
4 4 3　distinct操作符 107
4 4 4　转换操作符 108
4 4 5　聚合操作符 109
4 5　用不同的方式显示内存中的集合 110
4 5 1　排序 110
4 5 2　嵌套查询 111
4 5 3　分组 113
4 5 4　使用连接 114
4 5 5　分区 117
4 6　小结 121
第5章　超越基本的内存数据查询 122
5 1　常见使用场景 122
5 1 1　查询非泛型集合 123
5 1 2　按照多个条件分组 125
5 1 3　动态查询 127
5 1 4　linq to text files 135
5 2　设计模式 137
5 2 1　函数式创建模式 138
5 2 2　foreach模式 140
5 3　性能分析 142
5 3 1　选择恰当的流操作方式 142
5 3 2　当心立即执行 144
5 3 3　linq to objects会降低代码的性能吗 146
5 3 4　使用linq to objects的代价 149
5 3 5　性能和简洁：鱼和熊掌不可兼得吗 151
5 4　小结 152
第三部分　查询关系型数据
第6章　linq to sql入门 156
6 1　走入linq to sql 157
6 1 1　创建对象映射 159
6 1 2　设定datacontext 161
6 2　通过linq to sql读取数据 161
6 3　继续改进查询 165
6 3 1　过滤 165
6 3 2　排序和分组 167
6 3 3　聚集 168
6 3 4　连接 169
6 4　操作有层级关系的对象 171
6 5　数据加载的时机以及为何要关心这些 174
6 5 1　延迟加载 174
6 5 2　立即加载详细信息 175
6 6　更新数据 177
6 7　小结 179
第7章　揭开linq to sql的本质 180
7 1　对象与关系数据的映射 180
7 1 1　通过在类中添加属性 181
7 1 2　使用外部xml文件实现映射 185
7 1 3　使用sqlmetal工具 186
7 1 4　linq to sql设计器 188
7 2　将查询表达式转换为sql 190
7 2 1　iqueryable接口 190
7 2 2　表达式树 191
7 3　业务实体的生命周期 193
7 3 1　跟踪变化 195
7 3 2　提交变化 196
7 3 3　操作离线数据 198
7 4　小结 200
第8章　linq to sql高级特性 201
8 1　处理并发修改 201
8 1 1　悲观式并发 201
8 1 2　乐观式并发 202
8 1 3　处理并发异常 204
8 1 4　使用事务解决冲突 207
8 2　高级的数据库功能 208
8 2 1　使用sql语句直接得到结果对象 209
8 2 2　使用存储过程 210
8 2 3　用户自定义函数 217
8 3　改进业务逻辑层 220
8 3 1　预编译的查询 220
8 3 2　使用部分类实现自定义业务逻辑 221
8 3 3　使用部分方法 223
8 3 4　使用对象继承 225
8 4　linq to entities简介 229
8 5　小结 231
第四部分 操作xml
第9章　linq to xml入门 234
9 1　什么是xml api 234
9 2　为什么需要另外一种xml编程api   235
9 3　linq to xml设计原则 236
9 3 1　核心概念：函数式创建 238
9 3 2　核心概念：上下文无关的xml创建过程 238
9 3 3　核心概念：简化了的名称 239
9 4　linq to xml中相关类的继承体系 241
9 5　在linq中操作xml 243
9 5 1　加载xml 243
9 5 2　解析xml 245
9 5 3　创建xml 246
9 5 4 使用visual basic xml字面量创建xml 249
9 5 5 创建xml文档 251
9 5 6 向xml中添加内容 254
9 5 7 从xml中移除内容 255
9 5 8 更新xml的内容 256
9 5 9 操作属性 258
9 5 10 保存xml 258
9 6 小结 259
第10章　使用linq to xml查询并转换xml 260
10 1　linq to xml轴方法 261
10 1 1 element 262
10 1 2 attribute 263
10 1 3 elements 264
10 1 4 descendants 264
10 1 5 ancestors 267
10 1 6 elementsafterself、nodes- afterself、elementsbefore-self和nodesbeforeself方法 268
10 1 7 visual basic的xml轴属性 269
10 2 标准查询操作符 271
10 2 1 使用select进行投影 273
10 2 2 使用where实现过滤 274
10 2 3 排序和分组 275
10 3　使用xpath查询linq to xml对象 278
10 4 转换xml 279
10 4 1 linq to xml转换 279
10 4 2　使用xslt转换linq to xml对象 282
10 5 小结 284
第11章　linq to xml常见场景 285
11 1 根据xml构建对象 285
11 1 1 目标 286
11 1 2 实现 287
11 2 根据对象创建xml 290
11 2 1 目标 290
11 2 2 实现 291
11 3 根据数据库中的数据创建xml 295
11 3 1 目标 296
11 3 2 实现 297
11 4 过滤并混合从数据库以及xml中得到的数据 301
11 4 1 目标 302
11 4 2 实现 302
11 5 读取xml并更新数据库 306
11 5 1 目标 306
11 5 2 实现 307
11 6 将文本文件转换为xml 319
11 6 1 目标 319
11 6 2 实现 320
11 7 小结 322
第五部分　linq无处不在
第12章　扩展linq 324
12 1 探寻linq的扩展机制 324
12 1 1 linq各个特性是如何实现的 325
12 1 2 自定义linq扩展能够实现什么 326
12 2 创建自定义查询操作符 327
12 2 1 改进标准查询操作符 327
12 2 2 辅助或领域相关的查询操作符 330
12 3 基本查询操作符的自定义实现 334
12 3 1 回顾查询翻译机制 334
12 3 2 查询表达式模式的规范 335
12 3 3 示例1：跟踪标准查询操作符的执行过程 337
12 3 4 限制：查询表达式冲突 338
12 3 5 示例2：非泛型的、领域相关的操作符 340
12 3 6 示例3：非序列的查询操作符 342
12 4 查询web服务：linq to amazon 343
12 4 1 linq to amazon介绍 344
12 4 2 需求 345
12 4 3 实现 346
12 5 iqueryable和iqueryprovider：linq to amazon高级版本 352
12 5 1 iqueryable和iqueryprovider接口 353
12 5 2 实现 356
12 5 3 究竟发生了什么 357
12 6 小结 358
第13章　应用程序各层中的linq 359
13 1　linqbooks应用程序概览 359
13 1 1 功能 359
13 1 2 程序ui概览 360
13 1 3 数据模型 362
13 2 linq to sql及数据访问层 362
13 2 1 回顾传统的三层架构 362
13 2 2 用专门的数据访问层还是linq to sql 364
13 2 3 linqbooks 中对linq to sql的使用 368
13 3 linq to xml的使用 374
13 3 1 从amazon中导入数据 374
13 3 2 生成rss 376
13 4 linq to dataset的使用 377
13 5 使用linq to objects 380
13 6 可扩展性 380
13 6 1 自定义查询操作符 380
13 6 2 创建并使用自定义linq提供器 381
13 7 展望未来 381
13 7 1 自定义linq功能 382
13 7 2 linq to xsd：强类型的linq to xml 382
13 7 3 plinq：支持并行计算的linq 383
13 7 4 linq to entities，ado net entity framework的linq接口 383
13 8 小结 384
第14章　使用linq操作dataset 385
14 1 linq to dataset概览 385
14 2 dataset回顾 386
14 2 1 dataset使用场景及功能 386
14 2 2 dataset是什么 387
14 2 3 visual studio 2008和 net 3 5为支持linq to dataset进行的改进 389
14 3 查询弱类型dataset 390
14 3 1 为dataset加载数据 390
14 3 2 不使用linq查询dataset 394
14 3 3 使用linq to dataset查询弱类型dataset 395
14 4 查询强类型dataset 399
14 4 1 生成强类型的dataset 400
14 4 2 为强类型dataset加载数据 402
14 4 3 使用linq to dataset查询强类型dataset 404
14 5 将linq to dataset查询结果绑定至ui控件 406
14 5 1 使用copytodatatable将linqto dataset查询结果复制到datatable 406
14 5 2 使用asdataview实现双向数据绑定 408
14 6 在linq to dataset中使用查询操作符 410
14 6 1 用于datarow的field(t)和setfield(t)操作符 410
14 6 2 集合操作符以及用datarowcomparer比较datarow 411
14 7 小结 412
附录　标准查询操作符    414
译者序
此刻您手中这本沉甸甸的书，虽然来得晚了一些，但仍旧是不可多得LINQ权威学习指南。 
在最近一年的工作中，我会经常用到LINQ。毫不夸张地说，我无法想象再回到没有LINQ的 NET日子会是怎样，我深深地折服于其给每个开发人员带来的方便和简化——LINQ在程序世界和数据世界之间架起了一座桥梁。译者序不是王婆卖瓜的地方，但在此我仍然忍不住要说，当读者阅读本书之后，相信在掩卷沉思时，你会知道将“不可能”变成“可能”也不过是瞬间的灵感，而又如此简单。
In Action系列图书（国内一般翻译为“实战”），从早期风靡国内的Ajax In Action 开始，很快成就了Manning出版社，也创出了它自己的风格。自然，包括本书在内的这一系列图书讲究实战，但示例代码和介绍文字之间的平衡却拿捏得非常合适。没有长篇累牍教科书一般的说教，也不会看到连续数页的代码仅仅用来演示“hello world”。每当你觉得有些不解的时候，一段精炼的示例代码定会出现在眼前。而理解之后，接下来的转折一笔又让你欲罢不能，继续深入阅读。  
作者Marguerie先生为此书花费了两年的心血，相信朋友们在阅读时能够体会到行文中流露出来的良苦用心。本书原版的语言非常简洁流畅，没有丝毫浮华的卖弄，而力求用最平实的语言给出最恰如其分的介绍，所谓大音希声，大象无形。作为本书的翻译者，我在翻译的过程中甚至无法控制继续阅读的想法，忍不住一气通读到底——就像是一篇情节曲折的小说，会莫名地猜出你的想法，牢牢地抓住你的心。
限于自身水平，译本很多地方难免有所不足乃至错误，还望各位读者不吝斧正。您可以通过电子邮件dflyingchen@gmail com与我联系，给出您的建议、意见和问题。
本书从开始翻译到成稿，确有一年整时间，其中纷繁芜扰，我冷暖自知，不必多言。只是感谢人民邮电出版社的各位朋友，你们对我放纵时的宽容，感激不尽。   
前言
我之所以选择软件开发作为职业，是因为这是一个不断发展变革的行业。总会有一些新的东西值得学习，因此你永远都不会觉得厌倦。除了学习之外，我也对教授软件开发技术非常感兴趣。而撰写本书，则既能够学到东西，又可以分享我的心得。 
在开始撰写本书时，LINQ还仅仅是个早期的原型。本书随着LINQ的不断演化而数易其稿，我们也在不断地探索和发现。探索和发现也正是软件开发人员每天工作的一部分，我们必须紧紧跟上技术的脚步，并不停地学习新的东西。软件开发环境的发展正变得越来越快，这种趋势本身没有任何改变的迹象。
NET同样也是一个快速发展的技术。在最近的几年中就发布了两个主要的 NET Framework版本。伴随着这两个新版本的，还有一系列开发人员将会用到的新技术，例如WPF（Windows Presentation Foundation）、WCF（Windows Communication Foundation）、WF（Windows Workflow Foundation）、ASP NET AJAX、Silverlight和LINQ等。 NET的另外一个趋势就是其支持的编程语言数量正在快速增加。例如将要在Visual Studio中和C#/VB NET并驾齐驱的F#语言，就将函数式编程的概念引入到了 NET领域。对于Python和Ruby之类的动态语言， NET也正在计划通过动态语言运行时（Dynamic Language Runtime）来支持它们。  
在接下来的几年中，我们将会用到越来越多的编程语言。C#和Visual Basic等 NET语言的一大优势就是其不停地根据需要进行着演化——最新版本的C#和Visual Basic就通过LINQ支持集成于语言的查询功能。
除了为处理数据提供全新的方法之外，LINQ还代表了一种朝着声明式以及函数式编程发展的转变。当人们问我为什么要学习LINQ时，我会告诉他们LINQ可以处理XML、关系型数据以及内存中的集合，更会提到LINQ还能帮助开发人员使用声明式编程、延迟执行以及lambda表达式。
现在就开始你的LINQ之旅吧！你不但会看到这种新技术的使用方法，也会把握住编程语言的发展趋势。本书的一个重要目标就是帮助你完整地理解LINQ所带来的种种革命性的新概念。   
序言
提笔为这本书写序并不容易，不是因为回首望去，LINQ的开发历程漫长而又千辛万苦；也不是因为我此时此刻热泪盈眶，心潮澎湃；也并非因为我必须字斟句酌地来总结这个倾注了我全部心血的产品。之所以说不容易，是因为这定会成为一本备受推崇的书，让我很难揣摩出一个恰如其分的点睛之笔去形容它。 
对我而言，LINQ项目早在发布任何官方消息数年之前就已经悄然开始了，那时我正在参与一个新的托管ADO的计划和架构设计。当时，几个非常聪明的开发者非常大胆地建议，让我们将那些传统的数据访问API统统扔掉，而是基于对象和元数据进行设计，因为元数据和对象是最新的运行时（即Java运行时）的基石。不过这个建议并没有被采纳——传统的想法占据了上风，那时我也坚定地站在了传统的一方。但由此我理解了数据应该处于任何编程系统的核心，而不仅仅是其附庸。有理由认为，在基于对象的系统中，应该让数据也作为对象。不过，要实现这个理想，却注定要经历九九八十一难。  
作为一名工程师，我时刻位于微软公司各种新技术的风口浪尖上，我们要设计新的API、创造新的语言特性，带动技术向前发展。虽然很多想法从未有机会变成最终的产品，但每次尝试却都是迈向正确方向时不可或缺的一步。LINQ正是这些努力、斗争以及教训的最终结晶。它凝聚着团队成员敏锐的洞察力和对计算机科学理论及技术的深入理解，而且若是缺少了Anders Hejlsberg的睿智与专注细节，LINQ也不可能成为现实。
当然，其中还有你们大家的努力。开发者社区在论坛和博客上的讨论对LINQ的成形产生了极为深远的影响。能够在开发的过程中就得到如此迅捷的反馈，不亚于在漆黑一片的房间中点起了一盏明灯。更让人高兴的是看到星星之火得以燎原，许多开发者逐步成长为专家、传道者，开始做讲座、写文章，大家相互交流，彼此启发。
这也正是此书的重要之处。Fabrice、Jim和Steve就是社区中的重要成员，他们在书中展示了LINQ技术的精华。这是一本来自民间、写给民间的书，就像是举办一场所有人都将表演的LINQ派对一样。
因此，快去享受这场狂欢吧，别再等我琢磨什么点睛之笔了。   
Matt Warren
微软公司首席架构师
媒体评论
本书对你掌握LINQ的各种功能有很大的帮助。书中介绍了查询操作符、Lambda表达式和表达式树等，也提供了很多非常有用的代码片段。特别是那些混合操作多种不同数据源的例子，极其实用！ 
——Gianni Giaccaglini，意大利电子和IT撰稿人
本书详细介绍了LINQ技术，适合 NET平台上的每个开发人员阅读。这本书能够让你领悟LINQ思想，而不仅仅停留在使用该工具查询SQL或XML数据之上。要知道，LINQ能够帮助你非常优雅地实现很多从前难以想象的工作。
——Golo Roden， NET以及相关领域作者、演讲者、培训师
用非常简单的方式清楚地解释了如此复杂的概念，令人赞叹！
——Jose Rolando Guay Paz，CSW Solutions公司Web开发者
我将把本书放在案头，随时参阅。
——Joseph Guadagno，Southeast Valley NET用户组创始人
本书将无可争辩地成为LINQ的最权威教材。其中介绍了LINQ的历史，分析了其长处和不足，说明了为何、何时及怎样使用LINQ的各种技术。
——Carlos A  Lone，危地马拉 NET用户组
毫无疑问，要想真正学会LINQ及其所有标准的提供器，这本书是最佳选择。我在用户组上的一次演讲就参考了这本书的内容。绝对物超所值！
——Adam Wolf，Southeast Valley  NET用户组
本书最吸引我的地方就是，在每一节开始时，都会用简洁易懂的示例演示最重要的功能。随后拉开大幕，逐一解释每条LINQ查询和每个LINQ功能。
——Scott Mitchell，MSDN杂志
最好的C#/LINQ图书。
坦诚地说，若想开始学习LINQ及其使用方法和适用场景，那么这本书将是你的不二之选。
——Eggheadcafe com的读者
我真的太喜欢这本书了。从 NET刚刚出现的那一刻起，我就期待着一种像LINQ这样的技术。现在对象和关系型数据之间的壁垒终于被从容地打通，而这本书很好地展示了这一切。
——Leo Brown，软件开发者  
我无法掩饰对本书的喜爱，它不仅仅介绍了LINQ to SQL，对其框架的各种其他功能也都有深入介绍，能够帮助你透彻理解LINQ的方方面面。