第一部分 为LINQ作准备 1
第1章 使用匿名类型 1
1.1 理解匿名类型 2
1.2 使用匿名类型 3
1.2.1 定义简单匿名类型 3
1.2.2 使用数组初始化器语法 4
1.2.3 创建复合匿名类型 4
1.2.4 在for语句中使用匿名类型索引 7
1.2.5 匿名类型和using语句 9
1.2.6 从函数返回匿名类型 11
1.3 匿名类型的数据绑定 12
1.4 测试匿名类型的相等性 17
1.5 通过LINQ查询使用匿名类型 17
1.6 泛型匿名方法简介 18
1.6.1 使用匿名泛型方法 20
1.6.2 实现内嵌的递归 20
1.7 小结 21
第2章 使用复合类型初始化 22
2.1 通过命名类型初始化对象 22
2.1.1 实现能够通过命名类型进行复合类型初始化的类 24
2.1.2 理解自动实现属性 26
2.2 初始化匿名类型 26
2.3 初始化集合 28
2.3.1 完成Hypergraph 29
2.3.2 使用观察者模式实现Hypergraph控制器 37
2.4 使用转换运算符 41
2.4.1 ToArray 41
2.4.2 OfType 44
2.4.3 Cast 44
2.4.4 AsEnumerable 45
2.4.5 ToList 46
2.4.6 ToDictionary 46
2.4.7 ToLookup 47
2.5 小结 49
第3章 定义扩展方法和分部方法 50
3.1 扩展方法及其使用规则 50
3.2 定义扩展方法 52
3.2.1 实现扩展方法 52
3.2.2 重载扩展方法 55
3.2.3 定义泛型扩展方法 56
3.3 扩展方法是如何支持LINQ的 60
3.4 实现一个“会说话的”字符串扩展方法 64
3.5 定义分部方法 66
3.6 小结 69
第4章 yield return:使用.NET的状态机生成器 70
4.1 理解yield return的工作方式 70
4.2 使用yield return和yield break 72
4.2.1 测试代码性能 77
4.2.2 使用yield break 78
4.3 小结 78
第5章 理解Lambda表达式和闭包 79
5.1 了解由函数指针到Lambda表达式的演化过程 79
5.2 编写基本的Lambda表达式 83
5.2.1 自动属性 83
5.2.2 阅读Lambda表达式 84
5.2.3 Lambda表达式用作泛型活动 85
5.2.4 搜索字符串 87
5.2.5 Lambda表达式用作泛型谓词 88
5.2.6 将Lambda表达式绑定到控件事件 90
5.3 利用Lambda表达式进行动态编程 90
5.3.1 使用Select〈T〉和Lambda表达式 91
5.3.2 使用Where〈T〉和Lambda表达式 92
5.3.3 使用OrderBy〈T〉和Lambda表达式 93
5.3.4 将Lambda表达式编译为代码或数据 94
5.4 Lambda表达式和闭包 97
5.5 柯里化 98
5.6 小结 99
第6章 使用标准查询运算符 101
6.1 了解LINQ是如何实现的 101
6.2 构造一个LINQ查询 101
6.3 筛选信息 102
6.4 使用限定符 103
6.5 利用Skip和Take实现分区操作 105
6.6 使用生成运算 106
6.6.1 DefaultIfEmpty 106
6.6.2 Empty 106
6.6.3 Range 106
6.6.4 Repeat 107
6.7 相等性测试 108
6.8 从序列中获取特定元素 109
6.9 通过Concat串联序列 110
6.10 小结 111
第二部分 针对对象的LINQ第7章 对查询进行排序和分组 113
7.1 对信息进行排序 113
7.1.1 按升序和降序排序 113
7.1.2 直接使用扩展方法执行降序排列 116
7.1.3 执行次要排序 117
7.1.4 翻转元素顺序 119
7.2 对信息进行分组 120
7.3 小结 124
第8章 执行聚合运算 125
8.1 聚合 125
8.2 求集合平均值 127
8.3 元素计数 130
8.4 找出最小和最大的元素 130
8.5 计算查询结果的总计 134
8.6 中位数:实现一个自定义聚合运算 135
8.7 小结 136
第9章 执行集合运算 137
9.1 找出非重复元素 137
9.2 通过Intersect和Except定义集合 145
9.3 使用Union创建复合结果集 150
9.4 小结 151
第10章 掌握Select和SelectMany 152
10.1 探究Select 152
10.1.1 带有函数调用功能的选择 152
10.1.2 使用Select谓词 156
10.1.3 从数据访问层返回自定义业务对象 156
10.1.4 使用Select的索引打乱数组 160
10.1.5 构造21点扑克牌游戏的基础功能 161
10.1.6 从计算所得的值上投影出新类型 165
10.1.7 引入DLL 165
10.1.8 同时使用GDI+和Windows API(或外部DLL)方法 166
10.1.9 使用Select将单词的首字母改为大写 166
10.2 从多个源中投影出新类型 167
10.3 使用SelectMany从多个序列中创建出一个新序列 169
10.4 在SelectMany中使用索引 171
10.5 小结 172
第11章 联接查询结果 173
11.1 使用多个from子句 173
11.2 定义内联接 174
11.3 使用自定义(或非等式)联接 176
11.3.1 实现非等式自定义联接 176
11.3.2 实现带有多个谓词的自定义联接 179
11.3.3 实现带有临时范围变量的自定义联接 180
11.4 实现分组联接和左外联接 184
11.4.1 定义分组联接 184
11.4.2 实现左外联接 186
11.5 实现交叉联接 188
11.6 在组合键上定义联接 195
11.7 小结 196
第12章 查询Outlook和活动目录 197
12.1 LINQ to Outlook 197
12.2 通过纯C#代码查询活动目录 200
12.3 LINQ to Active Directory 201
12.3.1 创建IQueryable LINQProvider 202
12.3.2 实现IQueryProvider 203
12.3.3 将活动目录定义为数据源 204
12.3.4 将LINQ查询转换成活动目录查询 207
12.3.5 实现辅助标签 212
12.3.6 定义活动目录架构实体 214
12.4 通过LINQ查询活动目录 215
12.5 小结 217
第三部分 针对数据的LINQ第13章 使用LINQ查询关系型数据 219
13.1 定义表对象 219
13.1.1 将类映射到表 222
13.1.2 查看由LINQ生成的查询文本 226
13.2 通过DataContext对象连接关系型数据 228
13.3 查询数据集 230
13.3.1 从DataTable中获取数据 231
13.3.2 查询DataTable时使用Where子句 232
13.3.3 使用分区方法 233
13.3.4 在DataTable上进行排序 234
13.3.5 在DataSet上定义联接 234
13.4 SqlMetal:使用实体类生成工具 236
13.5 使用LINQ to SQL类设计器 236
13.6 小结 238
第14章 创建更好的实体以及映射继承和聚合 239
14.1 使用可空类型定义更好的实体 239
14.2 为LINQ to SQL映射继承层次结构 243
14.2.1 使用LINQ to SQL设计器创建继承映射 246
14.2.2 使用LINQ to SQL设计器修改现有类 247
14.3 将EntitySet类添加为属性 249
14.4 使用LINQ to SQL创建数据库 253
14.5 小结 255
第15章 通过LINQ查询关联数据库表 256
15.1 通过LINQ to DataSet定义联接 256
15.1.1 编写等式联接 256
15.1.2 编写不等式联接 258
15.1.3 定义左外联接以及右外联接简介 259
15.1.4 思考右联接 261
15.2 通过LINQ to SQL定义联接 262
15.2.1 编写等式联接 263
15.2.2 实现分组连接 266
15.2.3 实现左联接 276
15.3 使用LINQ查询视图 284
15.3.1 构建SQL Server中的视图 284
15.3.2 使用LINQ to SQL查询视图 285
15.4 使用LINQ to DataSet进行数据绑定 288
15.5 小结 290
第16章 更新匿名关系型数据 291
16.1 添加和移除数据 291
16.1.1 通过LINQ to SQL插入数据 291
16.1.2 通过LINQ to SQL删除数据 293
16.1.3 通过LINQ to SQL更新数据 295
16.1.4 使用存储过程 296
16.2 调用用户自定义函数 303
16.3 使用事务 306
16.4 理解冲突解决 308
16.4.1 为SubmitChanges指明冲突处理模式 308
16.4.2 捕获并解决并发冲突 310
16.5 N层应用程序与LINQ to SQL 314
16.6 小结 319
第17章 ADO.NET 3.0与Entity Framework简介 320
17.1 理解问题和解决方案的一般性本质 320
17.1.1 理解跟C#程序员有关的关系型数据库模型的问题 321
17.1.2 理解Entity Framework是如何解决这个问题的 321
17.1.3 理解解决方案的本质 322
17.2 寻找附加资源 322
17.2.1 Wikipedia 323
17.2.2 Entity SQL Blog 323
17.2.3 下载并安装Entity Framework 323
17.2.4 下载范例 324
17.2.5 关注时事新闻 324
17.3 通过普通的ADO.NET编程构建一个简单的应用程序 324
17.3.1 定义一个用以保存股票报价的数据库 325
17.3.2 添加一个用于插入报价信息的存储过程 326
17.3.3 添加一个外键 328
17.3.4 参考:完整的示例数据库脚本 329
17.3.5 编写代码以获取股票报价并更新数据库 332
17.4 使用Entity Framework进行编程 335
17.4.1 创建实体数据模型 335
17.4.2 添加一个关联 336
17.4.3 使用Entity SQL查询实体数据模型 336
17.4.4 使用LINQ to Entities查询实体数据模型 339
17.5 使用LINQ完成所有事情 340
17.6 小结 343
第四部分 针对XML的LINQ 345
第18章 从XML中提取数据 345
18.1 加载XML文档 345
18.2 查询XML文档 346
18.2.1 使用XDocument 346
18.2.2 使用XElement 349
18.2.3 管理属性 350
18.3 从字符串中加载XML 352
18.4 处理缺失的数据 353
18.5 使用查询表达式和XML数据 355
18.5.1 使用命名空间 355
18.5.2 嵌套查询 356
18.5.3 使用Where子句进行筛选 357
18.5.4 根据上下文查找元素 358
18.5.5 对XML查询进行排序 359
18.5.6 通过let计算中间值 360
18.6 批注节点 361
18.7 小结 362
第19章 比较LINQ to XML与其他XML技术 363
19.1 比较LINQ to XML和XPath 363
19.1.1 使用命名空间 364
19.1.2 查找子元素 366
19.1.3 查找兄弟元素 367
19.1.4 过滤元素 367
19.2 比较LINQ to XML转换和XSLT 368
19.3 通过函数构造来转换XML数据 375
19.4 小结 376
第20章 从非XML数据构造XML 377
20.1 从CSV文件构造XML 377
20.2 从XML生成文本文件 380
20.3 使用XML和嵌入式LINQ表达式(VB) 381
20.4 小结 384
第21章 使用XmlWriter生成XML 386
21.1 快速浏览XmlWriter 387
21.2 使用XmlTextWriter编写XML文件 387
21.3 小结 389
第22章 将XML与其他数据模型相结合 390
22.1 从SQL数据创建XML 390
22.1.1 定义对象关系映射 391
22.1.2 从SQL数据构造XML文档 392
22.1.3 使用XComment节点类型 395
22.1.4 在TreeView中显示XML文档 395
22.2 从XML更新SQL数据 398
22.3 小结 402
第23章 LINQ to XSD支持类型化XML编程 403
23.1 理解LINQ to XSD的基本设计目标 403
23.2 使用LINQ to XSD进行编程 404
23.2.1 下载并安装LINQ to XSD Preview 404
23.2.2 创建LINQ to XSD Preview Console Application 405
23.2.3 定义XML内容 405
23.2.4 定义XML Schema文件 407
23.2.5 向架构文件添加正则表达式 408
23.2.6 使用LINQ to XML for Objects进行查询 412
23.3 小结 414