本书结合C# 3.0和Visual Studio 2008对LINQ进行了实操型讲解。本书介绍了LINQ编程的各个方面,展示了LINQ是如何帮你显著提高生产效率的,还告诉了你应当如何用LINQ创建具有更高可靠性和可维护性的应用程序。
本书首先介绍了LINQ所用到的最新的C#编程技术,比如匿名类型、分部方法以及Lambda表达式等。接着,通过具体的示例和易于改写的范例代码,分别针对对象、数据库和XML详细介绍了LINQ这个强大的新技术。你将会对LINQ的工作方式有一个深入而实用的理解,还会学到如何通过XML与其它数据模型的结合来实现各种各样的数据处理功能。
本书不仅适合LINQ的初学者,而且对.NET数据处理人员、ASP.NET开发人员和Windows Form开发人员都有非常大的帮助,同时也可以作为高等学校计算机或相关专业的教材使用。
Microsoft积极参与的LINQ查询技术使得程序员可以轻松地从任何数据源获取任何数据,而且不用关心这些数据是从哪来的,也不用关心这些数据是如何存储的。
本书是一本优秀的教学指南,它结合C# 3.0和Visual Studio 2008对LINQ进行了讲解。本书介绍了LINQ编程的各个方面,展示了LINQ是如何帮你显著提高生产效率的,还告诉了你应当如何用LINQ创建具有更高可靠性和可维护性的应用程序。
本书首先介绍了LINQ所用到的最新的C#编程技术,比如匿名类型、分部方法以及Lambda表达式等。接着,通过具体的示例和易于改写的范例代码,分别针对对象、数据库和XML详细介绍了LINQ这个强大的新技术。你将会对LINQ的工作方式有一个深入而实用的理解,还会学到如何通过XML与其他数据模型的结合来实现各种各样的数据处理功能。
作者简介
Paul Kimmel是一名有着20多年工作经验的软件架构师和.NET开发人员。他经常为企业和政府机构设计和实现大型应用程序。他编撰的技术书籍包括《Visual Basic .NET Power Coding》、《Advanced C# Programming》、《UML Demystified》以及《Visual Basic .NET Unleashed》。他连续四年当选为Microsoft MVP。
本书示例源代码请从www.hzbook.com下载
编写高效的LINQ查询以处理.NET对象、SQL数据库以及XML数据。
利用匿名类型以降低编程难度,减少设计时间和调试时间。
利用yield return这个新概念自动生成.NET状态机。
掌握LINQ查询语法、运算符、扩展方法、排序、分组、聚合和集合操作等。
充分利用select以及在N层应用程序的业务层中使用它。
查询存储在Microsoft SQL Server中的关系型数据。
利用可空类型消除不必要的数据库访问代码。
结合ADO.NET 3.0以及Microsoft新推出的功能强大的Entity Framework使用LINQ。
提取XML数据(无需麻烦而复杂的XPath)。
从CSV文件和其他非XML数据中自动构造出XML。
通过对LINQ进行扩展的方式来查询活动目录。
从我第一次写代码算起,到你把这本书拿到手的那个时候,我就已经写了30年的代码了。最早的那段代码是用一台TRS-80上的ROM-BASIC编写的,那会儿我正在密歇根州奥沃索的华盛顿中学念五年级。让“坦克”倒着走并在屏幕上来回地放子弹,这的确是一件很爽的事情。还有更爽的,那就是,通过调整代码的方式来改变子弹的速度和目标的数量。年复一年,三十年过去了,我越来越为此而感到兴奋。有不少很棒的技术即将出现在我们面前,比如微软的Surface、Popfly以及LINQ等。本书就是关于LINQ(Language INtegrated Query,语言集成查询)的。
LINQ是为C#开发的一种类似于SQL的语言。我第一次看到它时,我真的不喜欢它。我的第一印象是,有人把C#搞得更烂了,用这玩意儿写出来的东西跟SQL一样丑。我不喜欢它完全是因为我还不了解它。不过,我给了LINQ第二次机会(我希望你也能这样),然后我发现,LINQ是高度集成的而且非常强大,简直就像是一辆Tesla Roadster或是一架Extra 300L。
LINQ的查询能力扩展到了对象、SQL、数据集、XML、XSD、实体上面,此外,还能扩展到其他提供者上面去,比如活动目录和SharePoint。也就是说,你可以针对对象、数据、XML、XSD、实体,或是活动目录而编写不同的查询语句(语法上都是相似的),就像是在数据库中编写SQL查询一样。另外,LINQ非常巧妙且出色的构建于泛型技术以及.NET 3.5中的一些新特性(比如扩展方法、匿名类型和Lambda表达式)之上。LINQ的另一个重要特点就是,它非常明显的表露出了微软的一种意愿,即既要革新又要利用那些最好的现有技术(如20世纪30年代出现的Lambda Calculus(λ演算));只要觉得某种技术还不错,那么就把这些元素吸收到我们所喜爱的工具或语言中去。
LINQ及其构成基础都很强大,在本书中,你将会学到许多知识,这将有助于你全面掌握LINQ的使用方法并快速上手。你将学到有关匿名方法、扩展方法、Lambda表达式、状态机等知识,并学习如何编写LINQ查询,还会了解到泛型和CodeDOM在诸如LINQ这样的强大工具中所扮演的角色。你将弄清楚一个问题,即为什么要在更大更复杂的应用场景中使用LINQ。你将意识到,如果不用再编写那些你没有必要亲自动手的代码的话,究竟可以省下多少时间和精力。此外,你还将认识到,LINQ其实是很适合于n层架构的,它能使您在沿其总体方针的情况下,按时完成任务。
本书是由一名获得了四次Microsoft MVP称号且做了十多年专栏作者的人编写的,本书将向你讲解有关LINQ以及NET 35新特性的一切知识,并告诉你如何变得比以前更有效率且获得更多的乐趣。
本书使用约定
本书所使用的排版约定如下:
代码行、命令、语句、变量以及你将在屏幕上看到的文字将使用等宽字体。
代码清单中偶尔出现的粗体字是用来提醒你当前所讨论的就是这段代码。
语法描述中的占位符将使用斜体等宽字体。你需要将这些占位符替换为实际的文件名、参数,或是它所代表的其他任何元素。
斜体字用于突出显示当前正在定义的技术术语。
代码行前面的连接符图标说明该行是上一行的延续。有时,一行代码会很长,因此无法在页面的一个单行上显示出来。如果你在某个代码行的前面看到了,那么请记得该行是前一行的一部分。
本书也含有注意、提示、警告等内容,它们将帮助你更快地找到重要或有用的信息。
LINQ编程技术内幕
Microsoft的LINQ查询技术使得程序员可以轻松地从任何数据源中获取任何数据,而且不用关心这些数据是从哪来的,也不用关心这些数据是如何存储的。
本书是一本优秀的教学指南,它结合C# 3.0和Visual Studio 2008对LINQ进行了实操型讲解。本书介绍了LINQ编程的各个方面,展示了LINQ是如何帮你显著提高生产效率的,还告诉了你应当如何用LINQ创建具有更高可靠性和可维护性的应用程序。
本书首先介绍了LINQ所用到的那些最新的C#编程技术,比如匿名类型、分部方法以及Lambda表达式等。接着,通过具体的示例和易于改写的范例代码,分别针对对象、数据库和XML详细介绍了LINQ这个强大的新技术。你将会对LINQ的工作方式有一个深入而实用的理解,还会学到如何通过XML与其他数据模型的结合来实现各种各样的数据处理功能。
? 编写高效的LINQ查询以处理.NET对象、SQL数据库以及XML数据。
? 利用匿名类型以降低编程难度,减少设计时间和调试时间。
? 利用yield return这个新概念自动生成.NET状态机。
? 掌握LINQ查询语法、运算符、扩展方法、排序、分组、聚合、集合操作等。
? 充分利用select(以及如何在N层应用程序的业务层中使用它)。
? 查询存储在Microsoft SQL Server中的关系型数据。
? 利用可空类型消除不必要的数据库访问代码。
? 结合ADO.NET 3.0以及Microsoft新推出的功能强大的Entity Framework使用LINQ。
? 提取XML数据(无需麻烦而复杂的XPath)。
? 从CSV文件和其他非XML数据中自动构造出XML。
? 通过对LINQ进行扩展的方式来查询活动目录。
作者简介
Paul Kimmel是一名有着20多年工作经验的软件架构师和.NET开发人员。他经常为企业和政府机构设计和实现大型应用程序。他编撰的技术书籍包括《Visual Basic.NET Power Coding》、《Advanced C# Programming》、《UML Demystified》以及《Visual Basic .NET Unleashed》。他连续四年当选为Microsoft MVP。
数据几乎影响着我们生活中的方方面面。我们所做的每件事情其实就是分析查阅数据,然后再以优惠券或其他市场营销手段对分析结果做出反应。在编写一个应用程序的时候,你可以清楚地知道这种或那种数据将会成为该解决方案的一部分。对于软件开发人员来说,在开发大型应用程序的时候,降低存取数据以及分析数据时的难度是很有必要的。事实上,数据会以各种各样的形式出现,人们很快便找到了一个具有很高价值的办法,即使用一个统一的框架来访问各种类型的数据。
多年以来,可供Windows开发人员使用的各种数据访问方法层出不穷。ADO和OLEDB,以及再后来的ADO.NET都为我们提供了一种统一的关系型数据库访问方法。MSXML和ADO.NET使我们能够遍历和操作XML文档。虽然这些技术都有着不同的优点和缺点,但是它们都有着同一个问题:它们都无法让开发人员在编写数据访问操作代码的时候觉得舒服、自然。
现在,LINQ使数据访问成为了NET中的一个高级编程概念,它使得开发人员能够用一种更有意义的方式来表述其所期望的查询。LINQ能够如此的强大,那是因为它让开发人员能够完全依靠智能感知技术来创建类型安全的数据访问代码和编译期的语法检查。
Paul Kimmel做了一件非常漂亮的事情,因为他用一种简洁而又完整的方式介绍了LINQ。他不仅使你了解了LINQ,而且还非常专业地阐述了诸如匿名类型(Anonymous Type)以及Lambda表达式(Lambda Expression)等概念。本书中的示例代码给出了一些利用该技术的应用程序,它们都是以一种简明扼要的方式呈现出来的。这是一本非常不错的图书,可以在周六早晨沏一壶咖啡边喝边看。我希望你也能研读一下这本书,然后你会跟我一样从中学到很多知识的。
Darryl Hogan
Architect Evangelist, Microsoft
(美)Paul Kimmel 著:暂无简介
唐学韬 等译:暂无简介
非常荣幸我能够翻译这本书,不仅因为它是SAMS公司大名鼎鼎的Unleashed系列的一员,更因为我平时也经常关注Paul Kimmel的系列文章。对我而言,Paul Kimmel是一个爱好非常广泛的程序员前辈,这一点从他的书或文章中能够很明显地感觉到,而我也一直想成为他这样的程序员。因此,这次当机械工业出版社华章分社的陈冀康老师找我翻译这本书的时候,我着实兴奋了一把。
本书的用辞很有意思,我在拿到原书之后,花了5天的时间一口气读完了,感觉就像是在看小说。Paul Kimmel不仅给我们带来了LINQ的完整学习方案,而且还在其中加入了不少的小故事,让读者能够更加愉快地学习LINQ这一门新技术,真正实现了“寓教于乐”的教学模式。
本书分四部分,共23章,分别介绍了LINQ的各个方面。在正式开始介绍LINQ之前,Paul在第一部分向我们讲解了使用LINQ所必需的一些基础知识,如匿名类型(Anonymous Type)和Lambda表达式(Lambda Expression)等,这使得我们可以在后续的学习过程中不会感到一丁点儿的吃力。在第二部分中,Paul向我们介绍了针对对象的LINQ。在这部分中,他着重介绍了LINQ的一些基本概念,为了使我们能够更好地理解这些知识,他还安排了一个章节的内容来介绍如何用LINQ操作Outlook和AD中的数据。在第三部分中,Paul着重向我们介绍了针对数据的LINQ,还前瞻性地介绍了ADONET 30和Entity Framework(当然,这本书出版的时候,这些东西差不多都已经正式发布了)。在本书最后一部分中,Paul介绍了针对XML的LINQ,在最后一章中还介绍了我们在XML变成时期待已久的智能感知解决方案——LINQ to XSD。由此可见,本书所讲解的内容真真切切地覆盖了LINQ编程的方方面面。
在我看来,Paul真的是做了一件很漂亮的工作,因为他不仅系统全面地介绍了LINQ这门新技术,而且还能让许多由于对LINQ一知半解而对其嗤之以鼻的人重新认识它。
大家准备好了吗?那么,我们就跟着Paul踏上美妙的LINQ之旅吧!唐学韬
2009年5月于广州
译者序
序
前言
致谢
第一部分为LINQ作准备
第1章使用匿名类型
11理解匿名类型
12使用匿名类型
121定义简单匿名类型
122使用数组初始化器语法
123创建复合匿名类型
124在for语句中使用匿名类型
索引
125匿名类型和using语句
126从函数返回匿名类型
13匿名类型的数据绑定
14测试匿名类型的相等性
15通过LINQ查询使用匿名类型
16泛型匿名方法简介
161使用匿名泛型方法
162实现内嵌的递归
17小结
第2章使用复合类型初始化
21通过命名类型初始化对象
211实现能够通过命名类型进行
复合类型初始化的类
212理解自动实现属性
22初始化匿名类型
23初始化集合
231完成Hypergraph
232使用观察者模式实现
Hypergraph控制器
24使用转换运算符
241ToArray
242OfType
243Cast
244AsEnumerable
245ToList
246ToDictionary
247ToLookup
25小结
第3章定义扩展方法和分部方法
31扩展方法及其使用规则
32定义扩展方法
321实现扩展方法
322重载扩展方法
323定义泛型扩展方法
33扩展方法是如何支持LINQ的
34实现一个“会说话的”字符串扩展
方法
35定义分部方法
36小结
第4章yield return:使用NET的
状态机生成器
41理解yield return的工作方式
42使用yield return和yield break
421测试代码性能
422使用yield break
43小结
第5章理解Lambda表达式和闭包
51了解由函数指针到Lambda表达式
的演化过程
52编写基本的Lambda表达式
521自动属性
522阅读Lambda表达式
523Lambda表达式用作泛型活动
524搜索字符串
525Lambda表达式用作泛型谓词
526将Lambda表达式绑定到控件
事件
53利用Lambda表达式进行动态
编程
531使用Select
表达式
532使用Where
表达式
533使用OrderBy
表达式
534将Lambda表达式编译为代码
或数据
54Lambda表达式和闭包
55柯里化
56小结
第6章使用标准查询运算符
61了解LINQ是如何实现的
62构造一个LINQ查询
63筛选信息
64使用限定符
65利用Skip和Take实现分区操作
66使用生成运算
661DefaultIfEmpty
662Empty
663Range
664Repeat
67相等性测试
68从序列中获取特定元素
69通过Concat串联序列
610小结
第二部分针对对象的LINQ
第7章对查询进行排序和分组
71对信息进行排序
711按升序和降序排序
712直接使用扩展方法执行降序
排列
713执行次要排序
714翻转元素顺序
72对信息进行分组
73小结
第8章执行聚合运算
81聚合
82求集合平均值
83元素计数
84找出最小和最大的元素
85计算查询结果的总计
86中位数:实现一个自定义聚合
运算
87小结
第9章执行集合运算
91找出非重复元素
92通过Intersect和Except定义集合
93使用Union创建复合结果集
94小结
第10章掌握Select和SelectMany
101探究Select
1011带有函数调用功能的选择
1012使用Select谓词
1013从数据访问层返回自定义
业务对象
1014使用Select的索引打乱数组
1015构造21点扑克牌游戏的
基础功能
1016从计算所得的值上投影出
新类型
1017引入DLL
1018同时使用GDI+和Windows API
(或外部DLL)方法
1019使用Select将单词的首字母
改为大写
102从多个源中投影出新类型
103使用SelectMany从多个序列中
创建出一个新序列
104在SelectMany中使用索引
105小结
第11章联接查询结果
111使用多个from子句
112定义内联接
113使用自定义(或非等式)联接
1131实现非等式自定义联接
1132实现带有多个谓词的自定义
联接
1133实现带有临时范围变量的
自定义联接
114实现分组联接和左外联接
1141定义分组联接
1142实现左外联接
115实现交叉联接
116在组合键上定义联接
117小结
第12章查询Outlook和活动目录
121LINQ to Outlook
122通过纯C#代码查询活动目录
123LINQ to Active Directory
1231创建IQueryable LINQ
Provider
1232实现IQueryProvider
1233将活动目录定义为数据源
1234将LINQ查询转换成活动
目录查询
1235实现辅助标签
1236定义活动目录架构实体
124通过LINQ查询活动目录
125小结
第三部分针对数据的LINQ
第13章使用LINQ查询关系型
数据
131定义表对象
1311将类映射到表
1312查看由LINQ生成的查询
文本
132通过DataContext对象连接关系型
数据
133查询数据集
1331从DataTable中获取数据
1332查询DataTable时使用
Where子句
1333使用分区方法
1334在DataTable上进行排序
1335在DataSet上定义联接
134SqlMetal:使用实体类生成工具
135使用LINQ to SQL类设计器
136小结
第14章创建更好的实体以及映射
继承和聚合
141使用可空类型定义更好的实体
142为LINQ to SQL映射继承层次
结构
1421使用LINQ to SQL设计器创建
继承映射
1422使用LINQ to SQL设计器修改
现有类
143将EntitySet类添加为属性
144使用LINQ to SQL创建数据库
145小结
第15章通过LINQ查询关联
数据库表
151通过LINQ to DataSet定义联接
1511编写等式联接
1512编写不等式联接
1513定义左外联接以及右外
联接简介
1514思考右联接
152通过LINQ to SQL定义联接
1521编写等式联接
1522实现分组连接
1523实现左联接
153使用LINQ查询视图
1531构建SQL Server中的视图
1532使用LINQ to SQL查询视图
154使用LINQ to DataSet进行数据
绑定
155小结
第16章更新匿名关系型数据
161添加和移除数据
1611通过LINQ to SQL插入数据
1612通过LINQ to SQL删除数据
1613通过LINQ to SQL更新数据
1614使用存储过程
162调用用户自定义函数
163使用事务
164理解冲突解决
1641为SubmitChanges指明冲突
处理模式
1642捕获并解决并发冲突
165N层应用程序与LINQ to SQL
166小结
第17章ADONET 30与Entity
Framework简介
171理解问题和解决方案的一般性
本质
1711理解跟C#程序员有关的关系型
数据库模型的问题
1712理解Entity Framework是如何
解决这个问题的
1713理解解决方案的本质
172寻找附加资源
1721Wikipedia
1722Entity SQL Blog
1723下载并安装Entity Framework
1724下载范例
1725关注时事新闻
173通过普通的ADONET编程构建
一个简单的应用程序
1731定义一个用以保存股票报价
的数据库
1732添加一个用于插入报价信息
的存储过程
1733添加一个外键
1734参考:完整的示例数据库
脚本
1735编写代码以获取股票报价并
更新数据库
174使用Entity Framework进行编程
1741创建实体数据模型
1742添加一个关联
1743使用Entity SQL查询实体
数据模型
1744使用LINQ to Entities查询
实体数据模型
175使用LINQ完成所有事情
176小结
第四部分针对XML的LINQ
第18章从XML中提取数据
181加载XML文档
182查询XML文档
1821使用XDocument
1822使用XElement
1823管理属性
183从字符串中加载XML
184处理缺失的数据
185使用查询表达式和XML数据
1851使用命名空间
1852嵌套查询
1853使用Where子句进行筛选
1854根据上下文查找元素
1855对XML查询进行排序
1856通过let计算中间值
186批注节点
187小结
第19章比较LINQ to XML与
其他XML技术
191比较LINQ to XML和XPath
1911使用命名空间
1912查找子元素
1913查找兄弟元素
1914过滤元素
192比较LINQ to XML转换和XSLT
193通过函数构造来转换XML数据
194小结
第20章从非XML数据构造XML
201从CSV文件构造XML
202从XML生成文本文件
203使用XML和嵌入式LINQ
表达式(VB)
204小结
第21章使用XmlWriter生成XML
211快速浏览XmlWriter
212使用XmlTextWriter编写XML
文件
213小结
第22章将XML与其他数据模型
相结合
221从SQL数据创建XML
2211定义对象关系映射
2212从SQL数据构造XML文档
2213使用XComment节点类型
2214在TreeView中显示XML
文档
222从XML更新SQL数据
223小结
第23章LINQ to XSD支持类型化
XML编程
231理解LINQ to XSD的基本设计
目标
232使用LINQ to XSD进行编程
2321下载并安装LINQ to XSD
Preview
2322创建LINQ to XSD Preview
Console Application
2323定义XML内容
2324定义XML Schema文件
2325向架构文件添加正则表达式
2326使用LINQ to XML for Objects
进行查询
233小结