第Ⅰ部分 LINQ基础 3
第1章 LINQ简介 3
1.1LINQ是什么 3
1.2为什么需要LINQ 4
1.3LINQ如何工作 6
1.3.1关系模型与层/网络模型的比较 7
1.3.2操作XML数据 12
1.4语言集成 14
1.4.1声明性编程 15
1.4.2类型检测 16
1.4.3透明跨越不同的类型系统 17
1.5LINQ实现形式 17
1.5.1LINQ to Objects 17
1.5.2LINQ to ADO.NET 18
1.5.3LINQ to XML 19
1.6小结 19
第2章 LINQ语法基础 20
2.1LINQ查询 20
2.1.1查询语法 20
2.1.2完整的查询语法 24
2.2查询关键字 25
2.2.1from子句 25
2.2.2where子句 28
2.2.3select子句 28
2.2.4group和into子句 29
2.2.5orderby子句 31
2.2.6join子句 32
2.2.7let子句 36
2.2.8其他的Visual Basic 2008关键字 36
2.3延迟查询求值和扩展方法解析 37
2.3.1延迟查询求值 37
2.3.2扩展方法解析 38
2.4关于LINQ查询的最后一些思考 40
2.4.1退化查询表达式 40
2.4.2异常处理 41
2.5小结 43
第3章 LINQ to Objects 44
3.1查询操作符 47
3.1.1Where操作符 47
3.1.2投影操作符 48
3.1.3排序操作符 52
3.1.4分组操作符 56
3.1.5联接操作符 59
3.1.6集合操作符 63
3.1.7聚合操作符 68
3.1.8Visual Basic 2008中的聚合操作符 76
3.1.9生成操作符 78
3.1.10量词操作符 80
3.1.11分区操作符 82
3.1.12元素操作符 85
3.1.13其他操作符 89
3.2转换操作符 90
3.2.1AsEnumerable 90
3.2.2ToArray和ToList 92
3.2.3ToDictionary 93
3.2.4ToLookup 94
3.2.5OfType和Cast 96
3.3小结 96
第Ⅱ部分 针对关系数据的LINQ 99
第4章 LINQ to SQL:查询数据 99
4.1LINQ to SQL中的实体 99
4.2数据建模 103
4.2.1DataContext类 103
4.2.2实体类 104
4.2.3实体继承 106
4.2.4唯一的对象标识符 108
4.2.5实体约束 109
4.2.6实体间的关联 109
4.2.7关系模型与分层模型的对比 116
4.3数据查询 116
4.3.1投影 118
4.3.2存储过程和用户自定义函数 120
4.3.3编译查询 127
4.3.4查询数据的不同方法 129
4.3.5直接查询 131
4.3.6实体的延迟载入 133
4.3.7属性的延迟载入 135
4.3.8访问只读的DataContext 136
4.3.9LINQ to SQL的局限性 137
4.4在LINQ to SQL的环境中进行思考 138
4.4.1IN/EXISTS子句 138
4.4.2精简的SQL查询 141
4.4.3.NET代码与SQL查询的混合 142
4.5小结 145
第5章 LINQ to SQL:管理数据 146
5.1CRUD和CUD操作 146
5.1.1实体更新 146
5.1.2数据库更新 153
5.1.3自定义插入、更新和删除操作 157
5.2数据库交互 158
5.2.1并发操作 158
5.2.2事务 162
5.2.3异常 163
5.3数据库和实体 164
5.3.1保留有效关系的实体属性 164
5.3.2派生实体类 166
5.3.3附加实体 168
5.3.4绑定元数据 172
5.3.5.NET和SQL类型体系的区别 174
5.4小结 175
第6章 LINQ to SQL的工具 176
6.1文件类型 176
6.1.1DBML(数据库标记语言) 176
6.1.2C#和Visual Basic源代码 178
6.1.3XML(外部的映射文件) 180
6.1.4LINQ to SQL文件的生成 181
6.2SQLMetal 183
6.2.1从数据库生成DBML文件 183
6.2.2从数据库生成源代码和映射文件 184
6.2.3从DBML文件生成源代码和映射文件 185
6.3使用对象关系设计器 185
6.3.1DataContext的属性 188
6.3.2实体类 189
6.3.3实体间的关联 192
6.3.4实体继承 198
6.3.5存储过程和用户自定义函数 199
6.3.6视图和架构支持 202
6.4小结 203
第7章 LINQ to DataSet 204
7.1LINQ to DataSet简介 204
7.2使用LINQ载入数据集 204
7.2.1用LINQ to SQL载入数据集 205
7.2.2用LINQ to DataSet载入数据 207
7.3使用LINQ查询数据集 208
7.3.1内部的DataTable.AsEnumerable 210
7.3.2用LINQ创建DataView实例 211
7.3.3使用LINQ查询具有类型的DataSet 212
7.3.4访问没有类型的DataSet数据 213
7.3.5DataRow比较 213
7.4小结 214
第8章 LINQ to Entities 215
8.1查询实体数据模型 215
8.1.1概述 215
8.1.2查询表达式 217
8.2管理数据 223
8.3查询引擎 223
8.3.1查询的执行 223
8.3.2深入ObjectQuery<T> 227
8.3.3经过编译的查询 229
8.4LINQ to SQL和LINQ to Entities 230
8.5小结 230
第Ⅲ部分 LINQ和XML 233
第9章 LINQ to XML:管理XML Infoset 233
9.1LINQ to XML简介 233
9.2LINQ to XML编程 236
9.2.1XDocument 237
9.2.2XElement 238
9.2.3XAttribute 241
9.2.4XNode 242
9.2.5XName和XNamespace 243
9.2.6其他的X*类 248
9.2.7XStreamingElement 249
9.2.8XObject和Annotations 250
9.3读取、遍历与改变XML 253
9.4小结 255
第10章 LINQ to XML:查询节点 256
10.1查询XML 256
10.1.1Attribute和Attributes 256
10.1.2Element和Elements 257
10.1.3“类似”扩展方法的XPath轴 258
10.1.4XNode选择方法 262
10.1.5InDocumentOrder 264
10.2延迟的查询求值 264
10.3对XML的LINQ查询 265
10.4使用LINQ to XML转换XML 271
10.5支持XSD和类型节点的有效性 273
10.6支持XPath和System.Xml.XPath 276
10.7LINQ to XML的安全性 278
10.8LINQ to XML序列化 279
10.9小结 280
第Ⅳ部分 高级LINQ 283
第11章 表达式目录树详解 283
11.1lambda表达式 283
11.2什么是表达式目录树 285
11.2.1创建表达式目录树 286
11.2.2封装 287
11.2.3不可变和修改 289
11.3解析表达式目录树 293
11.3.1Expression类 295
11.3.2表达式目录树节点类型 296
11.3.3实用节点 299
11.4访问表达式目录树 302
11.5动态构建表达式目录树 312
11.5.1编译器如何产生表达式目录树 312
11.5.2合并现有的表达式目录树 315
11.5.3动态组成表达式目录树 319
11.6小结 323
第12章 扩展LINQ 324
12.1自定义操作符 324
12.2现有操作符的特化 328
12.2.1危险的做法 331
12.2.2特化的限制 332
12.3创建自定义的LINQ提供程序 340
12.3.1IQueryable接口 341
12.3.2从IEnumerable到IQueryable与从IQueryable到IEnumerable 343
12.3.3IQueryable和IQueryProvider的本质 345
12.3.4编写FlightQueryProvider 348
12.4小结 370
第13章 并行LINQ 371
13.1.NET Framework并行扩展 371
13.1.1Parallel.For和Parallel.ForEach方法 371
13.1.2Do方法 373
13.1.3Task类 374
13.1.4Future<T>类 375
13.1.5并发考虑 376
13.2使用PLINQ 378
13.2.1PLINQ使用的线程 378
13.2.2PLINQ的实现形式 381
13.2.3PLINQ的用法 382
13.2.4并行执行的副作用 385
13.2.5PLINQ的异常处理 388
13.2.6PLINQ和其他的LINQ实现形式 389
13.3小结 391
第14章 其他的LINQ实现形式 392
14.1数据库访问 392
14.2没有数据库的数据访问 393
14.3LINQ to Entity域模型 394
14.4LINQ to Services 394
14.5系统工程师的LINQ 395
14.6动态的LINQ 396
14.7其他的LINQ增强功能和工具 396
14.8小结 397
第Ⅴ部分 LINQ的应用 401
第15章 在多层解决方案中的LINQ 401
15.1多层解决方案的特征 401
15.2两层解决方案中的LINQ to SQL 403
15.3在n层解决方案中的LINQ 404
15.3.1用LINQ to SQL替代DAL 404
15.3.2用XML外部映射抽取LINQ to SQL 405
15.3.3在实际的抽象内容中使用LINQ to SQL 408
15.3.4用LINQ to XML作为数据层 415
15.3.5用LINQ to Entities作为数据层 419
15.4在业务层中的LINQ 419
15.4.1优化代码的LINQ to Objects 420
15.4.2IQueryable<T>与IEnumerable<T>的对比 422
15.4.3识别正确的工作单元 425
15.4.4处理事务 426
15.4.5并发性和线程安全 426
15.5小结 426
第16章 LINQ和ASP.NET 427
16.1ASP.NET 3.5 427
16.1.1ListView 427
16.1.2ListView数据绑定 430
16.1.3DataPager 434
16.2LinqDataSource 438
16.2.1用LinqDataSource和DataPager分页数据 443
16.2.2用LinqDataSource处理数据修改 446
16.2.3用LinqDataSource进行自定义选取 449
16.2.4使用具有自定义类型的LinqDataSource 450
16.3绑定LINQ查询 452
16.4小结 456
第17章 LINQ和WPF/Silverlight 457
17.1与WPF一起使用LINQ 457
17.1.1绑定单个实体和属性 457
17.1.2绑定实体集 461
17.2与Silverlight一起使用LINQ 465
17.3小结 466
第18章 LINQ和Windows通信层编程框架 467
18.1WCF综述 467
18.1.1WCF协议和服务 468
18.1.2面向服务的协议 471
18.1.3端点和服务宿主 472
18.1.4服务用户 474
18.2WCF和LINQ to SQL 477
18.2.1LINQ to SQL的实体和序列化 477
18.2.2用WCF发布LINQ to SQL的实体 481
18.2.3采取WCF使用LINQ to SQL的实体 484
18.3LINQ to Entities和WCF 487
18.4查询表达式序列化 495
18.5小结 496
第Ⅵ部分 附录 501
附录A ADO.NET实体框架 501
A.1ADO.NET的标准方法 501
A.2从物理层抽取 504
A.3实体数据模型 506
A.3.1实体数据模型文件 506
A.3.2实体数据模型设计器和向导 511
A.3.3实体数据模型生成工具 514
A.3.4实体数据模型规则和定义 515
A.4用ADO.NET查询实体 515
A.5用LINQ查询ADO.NET实体 522
A.6用对象服务管理数据 523
A.6.1对象身份管理 525
A.6.2事务性操作 526
A.7手动实现的实体 526
A.8LINQ to SQL和ADO.NET实体框架 527
A.9小结 527
附录B C# 3.0:新语言特征 528
B.1重温C# 2.0 528
B.1.1泛型 528
B.1.2委托 530
B.1.3匿名方法 532
B.1.4枚举量和Yield 533
B.2C#3.0特征 539
B.2.1自动实现的属性 539
B.2.2本地类型推断 540
B.2.3lambda表达式 543
B.2.4扩展方法 548
B.2.5对象初始化表达式 554
B.2.6匿名类型 559
B.2.7查询表达式 563
B.2.8局部方法 564
B.3小结 566
附录C Visual Basic 2008:新语言特征 567
C.1Visual Basic 2008和可空类型 567
C.2If操作符 568
C.3Visual Basic 2008对应于C#3.0的特征 570
C.3.1本地类型推断 570
C.3.2扩展方法 571
C.3.3对象初始化表达式 573
C.3.4匿名类型 575
C.3.5查询表达式 578
C.3.6lambda表达式 580
C.3.7闭包 581
C.3.8局部方法 582
C.4Visual Basic 2008和C# 3.0不对应的特征 583
C.4.1XML支持 584
C.4.2非严格委托 589
C.5C#3.0和Visual Basic 2008不对应的特征 590
C.5.1yield关键字 590
C.5.2匿名方法 591
C.6小结 591