第一部分 从这里开始 2
第1章 LINQ简介 2
1.1LINQ是什么 2
1.1.1概览 3
1.1.2LINQ的功能 3
1.1.3作为语言扩展的LINQ 4
1.2为什么需要LINQ 6
1.2.1常见问题 6
1.2.2解决理念上的失调 8
1.2.3LINQ给出解决方案 12
1.3LINQ的设计目标及起源 13
1.3.1LINQ项目的设计目标 13
1.3.2一点历史 14
1.4LINQ to Objects初步:查询内存中的集合 15
1.4.1先决条件 15
1.4.2Hello LINQ to Objects 17
1.5LINQ to XML初步:查询XML文档 20
1.5.1为什么需要LINQ to XML 20
1.5.2Hello LINQ to XML 22
1.6LINQ to SQL初步:查询关系型数据库 26
1.6.1LINQ to SQL功能概览 26
1.6.2Hello 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.4Lambda表达式 40
2.4.1委托回顾 40
2.4.2匿名方法 42
2.4.3Lambda表达式介绍 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.1LINQ对.NET的扩展 61
3.1.1语言扩展回顾 61
3.1.2构成LINQ基础的核心元素 62
3.2序列 63
3.2.1IEnumerable<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.1Lambda表达式回顾 78
3.5.2表达式树是什么 78
3.5.3IQueryable,另一种实现延迟查询执行的方法 81
3.6LINQ的程序集以及命名空间 81
3.7小结 83
第二部分 查询内存中的对象 86
第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.1Web应用程序中的数据绑定 95
4.3.2Windows Forms应用程序中的数据绑定 100
4.4常用的标准查询操作符 103
4.4.1约束操作符where 104
4.4.2投影操作符 105
4.4.3Distinct操作符 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.4LINQ to Text Files 135
5.2设计模式 137
5.2.1函数式创建模式 138
5.2.2ForEach模式 140
5.3性能分析 142
5.3.1选择恰当的流操作方式 142
5.3.2当心立即执行 144
5.3.3LINQ to Objects会降低代码的性能吗 146
5.3.4使用LINQ to Objects的代价 149
5.3.5性能和简洁:鱼和熊掌不可兼得吗 151
5.4小结 152
第三部分 查询关系型数据 156
第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使用SqtMetal工具 186
7.1.4LINQ to SQL设计器 188
7.2将查询表达式转换为SQL 190
7.2.1IQueryable接口 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.4LINQ to Entities简介 229
8.5小结 231
第四部分 操作XML 234
第9章 LINQ to XML入门 234
9.1什么是XML API 234
9.2为什么需要另外一种XML编程API 235
9.3LINQ to XML设计原则 236
9.3.1核心概念:函数式创建 238
9.3.2核心概念:上下文无关的XML创建过程 238
9.3.3核心概念:简化了的名称 239
9.4LINQ 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.1LINQ to XML轴方法 261
10.1.1Element 262
10.1.2Attribute 263
10.1.3Elements 264
10.1.4Descendants 264
10.1.5Ancestors 267
10.1.6ElementsAfterSelf、Nodes-AfterSelf、ElementsBefore-Self和NodesBeforeSelf方法 268
10.1.7Visual 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.1LINQ 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无处不在 324
第12章 扩展LINQ 324
12.1探寻LINQ的扩展机制 324
12.1.1LINQ各个特性是如何实现的 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.1LINQ to Amazon介绍 344
12.4.2需求 345
12.4.3实现 346
12.5IQueryable和IQueryProvider:LINQ to Amazon高级版本 352
12.5.1IQueryable和IQueryProvider接口 353
12.5.2实现 356
12.5.3究竟发生了什么 357
12.6小结 358
第13章 应用程序各层中的LINQ 359
13.1LinqBooks应用程序概览 359
13.1.1功能 359
13.1.2程序UI概览 360
13.1.3数据模型 362
13.2LINQ to SQL及数据访问层 362
13.2.1回顾传统的三层架构 362
13.2.2用专门的数据访问层还是LINQ to SQL 364
13.2.3LinqBooks中对LINQ to SQL的使用 368
13.3LINQ to XML的使用 374
13.3.1从Amazon中导入数据 374
13.3.2生成RSS 376
13.4LINQ 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.2LINQ to XSD:强类型的LINQto XML 382
13.7.3PLINQ:支持并行计算的LINQ 383
13.7.4LINQ to Entities,ADO.NET Entity Framework的LINQ接口 383
13.8小结 384
第14章 使用LINQ操作DataSet 385
14.1LINQ to DataSet概览 385
14.2DataSet回顾 386
14.2.1DataSet使用场景及功能 386
14.2.2DataSet是什么 387
14.2.3Visual 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