图书前言

译  者  序

语言集成查询(Language Integrated Query,LINQ)是集成在.NET编程语言中的一种特性,是Visual Studio 2008和.NET Framework 3.5中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。它允许开发人员通过强类型化语法使用Microsoft .NET Framework 3.5代码编写类似SQL的查询。目前,它已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,具有丰富的元数据、智能感知、静态类型等强类型语言的好处,同时它还可以方便地对内存中的信息进行查询。正如Microsoft的LINQ首席程序经理Luca Bolognese说的,LINQ改变了编写程序的方式。

本书的作者Paolo Pialorsi与Marco Russo是DevLeap的创立者,近年来在业界的专业开发者用户社群非常活跃,经常提供关于Microsoft .NET Framework和Microsoft SQL Server方面的咨询和培训。本书分为6个部分,共有18章和3个附录,详细、深入、系统地介绍了LINQ基础、针对关系数据的LINQ、LINQ和XML、高级LINQ以及LINQ的应用。对难以掌握的关键技术,更是精益求精地分析、引导,力图让读者轻松理解。此外,书中还有大量的“注意”、“重要提示”、“更多信息”等特色段落,丰富和拓宽读者的视野。

本书的翻译是集体工作的结晶。在这里,首先要非常感谢本书的编辑,在本书翻译出版的过程中,编辑给予了及时并强有力的指导,可以说没有编辑那种精益求精的工作作风,很难想象这本书能得以顺利出版。本书序、前言、简介、第1~12章由李牧、何明星、汤波、张建祺、刘智丰、徐琴、张欣景、曾囡莉、曾囡芬和曹中华负责翻译和审校。第13~18章和附录由阎松涛、傅调平、方利君、石菲、焦华、陶辉云、阎利明、王斌、章水林、徐长江负责翻译和审校。全书最后由李牧负责统稿。在翻译过程中,我们对本书中出现的术语和难词难句都进行了仔细的推敲和研究,并广泛查阅资料,然而有些方面在译者的研究领域中也不曾遇到过,疏漏和争议之处在所难免,望广大读者提出宝贵的意见。

衷心祝愿广大的读者朋友能通过本书加深对LINQ编程的理解,并开始愉快而激动人心的程序设计之旅!

李  牧  阎松涛  傅调平

   2009年于羊城   

 

LINQ改变了编写程序的方式。至少对我来说如此。

广泛流传的对象关系技术在这方面不如LINQ。不要误会我的意思,我深爱对象关系技术。我在过去的8年中,有一大半时间是在微软从事构建对象关系框架的工作。我崇拜这项技术,因而在我们成功构建这项技术后,我激动万分。这是一个非常有用的框架。但是它并没有改变编写程序的思路。它允许使用面向对象范式操作关系数据,而且还可以在编程语言当中自始至终地使用面向对象范式。

甚至LINQ to XML也无法改变编写程序的方式。不可否认,这是一个非常完美的库。很快,我就能编写XML的代码并且理解XML。在Visual Basic中,我可以较容易地理解它;在C#中,我需要下些功夫才能理解它。但是,即使点缀了Anders Hejlsberg的灵巧设计,它也仍然只是一个库。Anders Hejlsberg的灵巧设计有助于编写更好的XML代码,但是它没有改变编写程序的思路。

LINQ的功能方面改变了我编写程序的方式。这是一个艰难的过程。我编写程序已经很长时间,而且每个开发人员有自己的编写思路(就我而言,是完全采用面向对象的编写思路)。每个人擅长用自己的方式来编写程序。

LINQ简洁的操作符以及这些操作符变化多端的组合方式最终征服了我。在我自己的程序代码中很少出现我能够挥洒自如地使用它的场合。随着设计的逐渐深入,我慢慢认识到我们创建了一种不只是一系列性能良好的库的东西,我们创建了表示查询的精美语法。我们制作了新库的蓝图,并且向人们提供工具创建这些新库。与此同时,我们致力于函数式编程与面向对象编程的前端集成。现在,我编写程序的方式就大为不同。

在以前研究对象的语言的时候,也的确做过类似的事情。但是,据我所知,这是首次把这些样式与主流的编程语言混在一起,以此创建一种框架,用于处理诸如数据库、XML、并行计算等非常基础的场景。

因此,使用这本非常有用的书可以学习如何使用LINQ。让我年轻的同事Marco和Paolo来指引你揭开LINQ to Objects、LINQ to SQL、LINQ to XML以及LINQ包含的其他所有内容的一切细节。但是不要忘记总体设计,要花一些时间理解基础的概念(也就是lambda表达式、表达式目录树、扩展方法等)。要深入研究第12章。你可以成为一个被动的LINQ使用者,也可以成为一个深入理解LINQ如何工作的使用者。我认为成为后者是一种更积极的态度。

Luca Bolognese 

LINQ首席程序经理

Microsoft   

 

前    言

我们第一次见到语言集成查询(Language Integrated Query,LINQ)是在2005年9月的专业开发人员大会(Professional Developers Conference,PDC)上,那次会议发布了LINQ项目。我们马上意识到LINQ具有长期的重要性和丰富的内涵。与此同时,我们也感到如果只是把LINQ看作一个具有包装访问关系数据能力的技术,将是一个巨大的错误。因为由LINQ引入的重要概念是从代码抽象中建立起来的,而代码抽象又是在无需担心失控的前提下,通过使用提高代码可读性的一贯方式完成的。我们喜爱LINQ,并且可以预见它将得到广泛的使用,但是我们担心使用者可能会对它的关键技术产生误解。出于这个原因,我们开始着手写一本关于LINQ的书。

当我们的提议被Microsoft Press采纳之后,就得到了写书的宝贵机会。我们首先在beta 1版本的基础上,编写了本书最初的简略版Introducing Microsoft LINQ。我们错误地估计,完成了简略版就相当于完成写整本书一半的工作量,但是实际上只完成了三分之一(甚至可能只有四分之一)的工作量。我们收到了很多Introducing Microsoft LINQ读者的反馈意见,并且很多重要的反馈意见都是负面的。今天,我们在写本书的前言,向读者推荐本书,并不是因为它是我们自己写的,而是因为这是一本值得购买的好书!

在付出了大约三年的心血之后,我们终于实现了写完这本书的宏伟目标,但是这本书对你而言还只是个开端。LINQ介绍了一种更具有说明性的编程风格,并且不是一种过渡的技术。C#的首席设计师Anders Hejlsberg曾经说过,LINQ试图解决代码与数据间不匹配的问题。我们认为LINQ可能已经比其他方法领先一步解决了这个难题,因为它还能被用来编写并行算法,比如使用并行LINQ(Parallel LINQ,PLINQ)时的算法。

LINQ可以渗透到软件体系结构当中,因为在应用程序的任何层都可以使用它。然而,与其他任何工具一样,它的使用有效性也受到限制。我们始终把如何最有效地使用LINQ这一理念贯穿全书。然而,做完所有这些工作之后,我们仍然感觉LINQ是一项“新”技术。我们认为你也会同我们一样,在开始的时候觉得使用LIQN查询关系型数据库非常自然。但是,在使用LINQ to Objects的查询编写操作内存数据的算法时,这个观念就会发生转变。这应该是容易的。实际上,只要阅读完本书的前三章,你就已经掌握了编写这种算法的知识。但是,其实这是最困难的一部分,因为你需要改变编写代码的思路。你需要用LINQ的方式来整理思路。我们没有找到一种神奇的方法来讲授这个内容。或许这与其他任何重大的变革一样,大家也需要时间和实践来完成这个转变。

祝大家阅读愉快!

 

简    介

本书深入而广泛地介绍了语言集成查询(Language Integrated Query,LINQ)。主要目标是让读者全面理解LINQ的内容,LINQ可以实现的内容和不能实现的内容等。本书的目标读者是掌握Microsoft .NET 2.0,并准备把开发环境升级到Microsoft .NET 3.5乃至4.0的.NET开发人员。

要正常使用LINQ,需要安装Microsoft .NET Framework 3.5和Microsoft Visual Studio 2008。

本书是基于LINQ的零售版(Released to Market,RTM)和Microsoft .NET 3.5编写的。但是有部分内容(比如LINQ to Entities、ADO.NET实体框架和并行LINQ等)仍然使用公开测试版(beta版)编写。这些技术的某些特征在最终的版本中可能被修改、删除或增加。我们提供一个网站(http://www.programminglinq.com/),发布关于LINQ项目进展程度和本书的更新列表、修订历史、勘误和博客等。我们还提供一个包含本书中涉及的所有URL的网页,在这个网页中,按照页码对这些URL排序,因此不用手动复制这些URL。

关于本书

这本书共分为6个部分,包括18章和3个附录。

如果你刚开始接触C# 3.0和Visual Basic 2008,我们建议你首先阅读附录B和附录C。这两个附录全面介绍了引入这些语言中并为LINQ提供全面支持的新特性。如果你已经熟悉了这些语言的新版本,那么如果在使用LINQ时对这些语言的语法产生疑惑,可以参考这两个附录。虽然我们在本书的例子中使用的主要语言是C#,但是几乎所有示例的LINQ特性都适用于Visual Basic 2008。在本书中有些时候也会使用Visual Basic 2008,此时就说明这些特性不适用于C# 3.0。

第I部分“LINQ基础”介绍LINQ,解释它的语法,并且阐述使用LINQ操作内存中的对象所需的一切信息。在学习其他LINQ实现形式之前学习LINQ to Objects是重要的,因为许多LINQ to Objects的特性都能用于本书介绍的其他LINQ实现形式。我们强烈推荐首先阅读此部分的3章内容。

第II部分“针对关系数据的LINQ”介绍对关系存储数据提供访问的所有LINQ实现形式。LINQ to SQL实现形式分为三章。第4章介绍映射关系数据到LINQ实体的基本知识,并且介绍如何建立可以转换成SQL查询的LINQ查询。第5章介绍如何使用LINQ to SQL的实体处理从数据库抽取出来的数据变化。第6章介绍有助于定义LINQ to SQL数据模型的工具。如果对在应用程序中使用LINQ to SQL感兴趣,建议完整阅读这3章内容。

第7章全面介绍目标为ADO.NET数据集的LINQ实现形式。如果有一个使用数据集的应用程序,通过本章可以掌握如何集成LINQ,至少可以学会如何利用LINQ to SQL或者LINQ to Entities逐步从数据集移植到域模型。

第8章描述包装对ADO.NET实体框架的访问的LINQ实现形式。建议在阅读完介绍LINQ to SQL的章节之后阅读这一章,原因在于这两个LINQ实现形式的概念非常相似,并且在后面的章节中也会经常引用这两个LINQ实现形式。在这一章中,我们假设你已经对ADO.NET实体框架有所了解。如果你在这方面还没有足够的经验,我们提供了附录,可以首先阅读附录。

第III部分“LINQ和XML”包括第9章和第10章。建议在开始进行任何有关读取或操作XML中数据的开发之前,阅读这两章内容。

第IV部分“高级LINQ”讨论本书中最复杂的主题。第11章介绍如何处理、生成和简单读取表达式目录树。第12章介绍如何使用自己的数据结构扩展LINQ,如何通过包装现有的服务扩展LINQ,以及如何通过创建自定义的LINQ提供程序扩展LINQ等。第13章介绍提供给.NET并行框架的LINQ接口。最后,在第14章中,总体介绍第三方供应商提供的最重要的LINQ组件。本部分中的任何一章均可单独阅读。这部分唯一引用了其他章节的是第12章,它引用了第11章的部分内容。

第V部分“LINQ的应用”阐述LINQ在分布式应用程序的几个不同场合下的用法。第15章是每个人都会感兴趣的章节,因为这是以体系结构为中心的章节,可以帮助你在设计应用程序时做出正确的决策。第16、17、18章介绍关于LINQ与现有库用法的相关信息,这些现有库包括ASP.NET、Windows表示层编程框架(Windows Presentation Foundation,WPF)、Silverlight、Windows通信层编程框架(Windows Communication Foundation,WCF)等。建议在深入学习这些特殊库的细节之前阅读第15章。如果没有使用与第16、17、18章对应的技术,可以不阅读这些章节。

第VI部分为附录,参见前文说明。

在线寻找补充内容  本书的更新内容会在Microsoft Press的Developer Tools网站公布。内容包括本书内容的更新、文章、配套内容的链接、勘误表、样章等。该网站很快就可以通过www.microsoft.com/learning/books/online/developer访问,并且会定期地进行更新。

系统需求

正常使用LINQ和管理我们提供的示例代码的系统需求如下所示。

? 支持的操作系统:Microsoft Windows Server 2003、Windows Server 2008、Windows Vista和Windows XP SP2

? Microsoft Visual Studio 2008

 

配套网站

本书的配套网站可以提供本书中用到的所有代码。代码按照主题进行组织,可以从该网站下载这些代码,网址为http://www.microsoft.com/mspress/companion/9780735624009。

本书的支持

我们尽量确保本书的准确性。Microsoft Press通过万维网提供本书的勘误,网址如下:http://www.microsoft.com/mspress/support/。

如果对本书有意见、问题或想法,请通过下列方式发送到Microsoft Press。

邮寄地址:

Microsoft Press 

Attn: Editor, Programming Microsoft LINQ 

One Microsoft Way 

Redmond, WA 98052-6399

电子邮件:

mspinput@microsoft.com

请注意,我们不会通过邮箱地址提供产品支持。通过浏览Microsoft的网站http://support.microsoft.com/,可以获得产品支持信息。