内容简介
本书由知名的微软数据库权威专家Roger Jennings编写,凝聚了Roger多年的数据库编程经验,具有很强的指导性和实用性。 本书详细介绍了LINQ和Entity Framework技术的方方面面,通过丰富的示例程序演示了如何使用这些新兴技术来提高编程效率。主要包含5部分内容:ADO.NET 3.5概览,LINQ架构和基本实现,LINQ to SQL等各种领域相关的 LINQ实现,ADO.NET实体框架介绍,以及如何实现ADO.NET实体框架。通过学习本书,您将轻松掌握如何利用LINQ和Entity Framework的前沿查询技术和对象/关系映射技术来推动企业级计算的革新。
前 言 语言集成查询(Language Integrated Query,LINQ),以及为支持它而对 C# 3.0 和 VB 9.0 语言所做的扩展,是 Visual Studio 2008 和.NET Framework 3.x 最重要的一个新功能。LINQ 是微软首次尝试为内存中各种不同数据集(包括一般对象、关系数据库表中持久化的实体、 XML 文档或片段的元素和属性,以及 RSS 和 Atom syndication feeds文件等其他多种数据 类型)而定义的一种统一查询语言。 微软向 Anders Hejlsberg 和他的 C#设计开发团队投入了 数百万美元来为 C# 3.0 增添新的功能,例如 lambda 表达式、匿名类型和扩展方法,特别 增加了对作为语言一部分的 LINQ 标准查询操作符(Standard Query Operators, SQOs)及查询 表达式的支持。 VB 9.0 也在 C#开发团队的引导下添加了对应的内容,值得注意的是,VB 对 LINQ to XML 的实现为语言本身增加了一个新的改进:XML 字面量(literals)。VB 的 LINQ to XML 实现包括了 XML 字面量,它将会把格式标准的 XML 文档或片段作为 VB 语言的一部分, 而不再需要把元素和属性的名和值从字符串翻译为 XML DOM 结点和值。 本书重在引导读者进行实际的 Windows 和 Web 应用程序的动手开发,通过 C#和 VB 编程技术的实例演示,力图使您的 LINQ 技术应用水平得到提高。本书前半部分覆盖的内 容包括标准查询操作符 SQO,以及使用 LINQ 的各种具体实现技术对实现了 IEnumerable和/或 IQueryable接口的集合进行查询。本书后半部分主要讲述 ADO.NET 实体框架、实体数据模型、Entity SQL(eSQL)和 LINQ to Entities。绝大多数代码 示例采用了模仿现今常用的数据源, 例如运行于 SQL Server 2005 或者 2008 Express Edition 的 Northwind 样例数据库,以及根据它的表派生的集合。除第 1 章的样例是简单的命令行 项目之外, 代码示例都是C#和VB Windows窗体或者Web站点/应用程序。 因为仅通过Hello World 项目这样处理小规模整型数组或姓名数组的 LINQ 查询,读者是不能够深刻体会到 LINQ 的表现或性能的。 读者对象 本书面向具有C# .NET或者VB.NET使用经验的开发者中那些希望获得最大幅度提升 的人,他们将因 Visual Studio 2008 中LINQ(包括 LINQ to Objects、LINQ to SQL、LINQ to DataSets、LINQ to XML)查询处理功能的实现而大大受益。同样,VS 2008 SP1 的实体框架 /实体数据模型的对象关系映射、LINQ to Entities 以及越来越多的第三方开源 LINQ 的实现 也将同样提升开发者的编程效率和程序性能。 本书假设您基本了解.NET 2.0 引入的语言功能、Visual Studio 集成开发环境以及关系 数据库管理系统(尤其是 Microsoft SQL Server 200X)。具有使用 SQL Server的 T-SQL 查询ADO.NET 3.5高级编程——应用LINQ & Entity Framework VI 语言以及存储过程的经验将会对阅读本书提供帮助,但这并不是必需的。同样,精通 VS 2005、.NET 2.0、C# 2.0 或者 VB 8.0 将会有助于对本书的 C# 3.0 或者 VB 9.0 代码示例的 了解,但这也并不是必要条件。 注释: 微软的.NET 代码样例主要用 C# 3.0 编写。本书章节和示例项目中的所有代码样例均 有 C#或者 VB 版本,但 T-SQL 或 JavaScript 程序除外。 本书内容 本书主要讲述如下几方面的编程技术:基于 LINQ to Objects 的 System.Linq 和 System.Linq.Expressions名称空间,基于 LINQ to SQL 的 System.Data.Linq 名称空间,基于 LINQ to DataSet 的 System.Data.Linq 名称空间,基于 LINQ to XML 的 System.Xml.Linq 名 称空间,以及基于实体框架 Entity SQL 的 System.Data.Entity 和 System.Web.Entity 名称 空间。 组织方式 本书分为 5 部分,每部分各有 1~5 章。除了第Ⅰ部分之外,每个部分都有一个大约 4 页的简介,对本部分各章的内容作一概述并介绍相关背景。绝大多数章节建立在先前章节 知识的基础上,所以应该循序渐进地阅读。下面将对各部分和其所属各章内容作一些简要 描述。 第Ⅰ部分 ADO.NET 3.5概览 第Ⅰ部分只有一章,通过实例概述了 LINQ和它在 4 个主要领域(LINQ to SQL、LINQ to Datasets、LINQ to XML、LINQ to Entities)的实现。本章的 26 个样例项目演示了如何利 用LINQ编码技术并基于C# 3.0和 VB 9.0语言实现简单控制台程序、 Windows窗体和Web 站点应用程序。 ● 第 1 章 “使用 ADO.NET 提供的新方法访问数据”用简单的 C#和 VB 代码例子演 示了如何使用 LINQ to Objects 技术实现对内存中对象的查询, 以及如何和由 LINQ 填充的通用 List集合进行数据绑定,使用 LINQ to SQL 进行对象/关系映射,使 用 LINQ to Datasets 连接 DataTables,使用 LINQ to Entities创建 EntitySets,使用 LINQ to XML 查询和操作 XML InfoSets,使用 LINQ to XSD 对强类型 XML 文档 执行查询。本章结尾处对实体框架和实体数据模型进行了介绍。 前 言 VII 第Ⅱ部分 LINQ 简介 第Ⅱ部分中的各章解释了.NET 3.5及C# 3.0和VB 9.0语言为支持LINQ对内存对象的 查询所做的改进。LINQ to Objects 是所有其他具体 LINQ 实现的基础。 ● 第 2 章“理解 LINQ 的体系结构和实现”首先介绍为支持 LINQ 而对 C#和 VB 语 言进行的扩展以及名称空间、LINQ 标准查询操作符、表达式树和编译查询,并对 领域相关的 LINQ 实现进行预习。本章的 C#和 VB 样例项演示了对象、数组、集 合初始化程序、扩展方法、匿名类型、谓词、Lambda 表达式及简单的查询表达式。 ● 第 3 章“使用 LINQ to Objects 执行 LINQ 查询表达式”将 50 个标准查询操作符划 分为如下分组:限制操作符、投影操作符、分区操作符、连接操作符、排序操作 符、分组操作符、集合操作符、转换操作符和相等操作符,并且列出了它们在 C# 和 VB 中的关键字。VS 2008 SP1 包括了 LINQ Project Sample Query Explorer 的 C# 和 VB 版本,但是这两个版本的浏览器并没有使用现实世界的集合作为数据源。因 此, 该章讲述了 LINQ内存对象生成器(LINQ in-memory object generator, LIMOG), 这个工具软件可以为(比 LINQ Project Sample Query Explorer 中使用的更为复杂的) 典型业务对象生成 C# 3.0 或 VB 9.0 类声明。使用这些业务对象作为数据源的样例 C#和 VB 查询比使用整数或姓名数组要更具表现力。 ● 第 4 章“使用高级查询操作符和表达式”介绍了在实体拥有关联实体的情况下, 如何对对象图执行 LINQ 查询。该章首先给出聚集操作符的例子,解释了 Let 临时 局部变量操作符的使用,展示了如何使用 Group By操作符进行聚集查询,完成左 外连接的等价操作,并利用 Contains()标准查询操作符模拟 SQL 的 IN()函数。您将 学习如何通过编译查询来提高性能,并在没有对关系持久性存储进行查询的开销 的情况下创建 mock 测试对象类。 第Ⅲ部分 使用领域相关的 LINQ 实现 第Ⅲ部分各章将引导读者进入 LINQ 应用程序学习的下一个阶段,即 SQL Server 200x 数据库的领域相关的版本、使用 DataTable、管理 XML Infosets,以及正在快速扩展的第三 方 LINQ实现队伍中的一些成员。每章为了讲解其中的内容都提供了 C#和 VB 样例项目。 ● 第 5 章“使用 LINQ to SQL 和 LinqDataSource”介绍了微软第一个达到产品发布状 态的 O/RM 工具 LINQ to SQL, 并讲述了如何使用图形化的 O/R Designer 或命令行 SqlMetal.exe 为实体类型自动生成类文件。该章也介绍了怎样使用设计器或 XML Editor来编辑*.dbml 映射文件, 如何实例化 DataContext 对象, 以及如何使用 LINQ to SQL作为T-SQL查询或存储过程的数据访问层。最后介绍了如何在Web站点或 应用程序中使用 ASP.NET LinqDataSource控件。 ADO.NET 3.5高级编程——应用LINQ & Entity Framework VIII ● 第 6 章“使用 LINQ to DataSet 查询 DataTable”首先比较了 DataSet 和 DataContext 对象及其功能,并讲述了 DataSetExtensions 的功能。然后介绍了如何查询无类型 和类型化的 DataSet、创建查找列表,以及如何使用 AsDataView()方法为数据绑定 生成 LinqDataView。本章最后介绍了怎样将 LINQ 查询结果复制到 DataTable。 ● 第 7 章“使用 LINQ to XML 处理文档”描述了 LINQ 最强大的一个功能:管理 XML Infosets。 该章演示了 LINQ to XML 所具有的和 XQuery 1.0 及 XPath 2.0 等同 甚至超越它们的查询和浏览能力。该章也证明 LINQ to XML 文档转换在绝大部分 常见情形下可以替代 XQuery 和 XSLT 1.0+。您将学习到怎样使用 VB 9.0 的 XML 字面量来构造 XML 文档、 使用 GroupJoin()来生成层次化文档以及如何在 C#和 VB 中使用 XML 名称空间。 ● 第 8 章“探索第三方和新兴的 LINQ 实现”描述了可以在 LINQ to Objects 查询中 充分利用多核 CPU 性能的微软 Parallel LINQ(也称为 PLINQ)、如何将 LINQ 查询 翻译为 REST(具象状态传输)URL 的 LINQ to REST(它使用 HTML GET、POST、 PUT和DELETE方法定义到Web服务的请求)以及由Bart de Smet编写的LINQ to Active Directory和 LINQ to SharePoint 的第三方实现。 第Ⅳ部分 ADO.NET 实体框架介绍 第Ⅳ部分深入介绍了实体数据模型(EDM)的体系结构和它的第一个实体框架对象/关 系映射工具的具体实现。微软希望实体数据模型成为定义概念数据模型的通用规范,在该 模型中来自各种各样的数据源的数据都被表示为实体(entity)和其关联(association)(也被称 为关系)。除了用于持久化对象的关系数据库之外,实体数据模型也将成为未来用于数据同 步和报表服务的组件之一。 ● 第 9 章“使用实体数据模型提升数据抽象级别”首先介绍了实体数据模型以及作 为对象/关系映射工具和 ADO.NET DataSet 继承者的实体框架的发展进程,并概要 描述了实体关系数据模型和图,然后详细分析了实体框架体系结构。随后简介了 Entity SQL(eSQL)语言、 eSQL 查询、 客户视图和 Object Service(包括 ObjectContext、 MetadataWorkspace和ObjectStateManager)。第11章详细描述了eSQL和这些对象。 该章的 eSQL 查询和 Object Service 样例代码被扩充成两个 C#和 VB 样例项目。 ● 第 10 章“定义存储层、概念层和映射层”深入分析了在运行时生成*.ssdl(存储架 构定义语言)、*.msl(映射规范语言)和*.csdl 文件的*.edmx 文件的结构。您将了解 在图形化 EDM Designer 不能解决问题的情况下怎样手动编辑*.edmx 文件, 以及怎 样实现每个层次结构一个表(TPH)继承模型和通过遍历 MetadataWorkspace 获取属 性值。该章的 4 个样例项目分别演示了映射、用存储过程代替查询和 TPH继承。 ● 第 11 章“Entity SQL 简介”分析了实体框架的新 eSQL 方言,eSQL 添加了用于区 分查询实体和查询关系表的关键字。您将会学习到怎样使用 Zlatko Michaelov 的前 言 IX eBlast 工具编写和分析 eSQL 查询,然后进一步讨论了 eSQL 和 T-SQL SELECT 查 询的区别(eSQL 第一版并不支持 INSERT、UPDATE、DELETE 和其他 SQL 数据 操作语言结构)。该章讲述了如何对 EntityClient 执行 eSQL 查询、测量 eSQL 相对 于T-SQL的性能损失、 执行参数化eSQL查询以及如何使用SQL Server Compact 3.5 作为数据存储区。C#和 VB 样例项目演示了该章所讲述的编程技术。 第Ⅴ部分 实现 ADO.NET 实体框架 第Ⅴ部分从实战角度讲述在SQL Server 200x中如何使用实体框架实现对象/关系映射、 使用 LINQ to Entities 查询、使用 LINQ to Entities更新传统实体和具有复杂类型的实体、将 对象服务的 ObjectContext 数据绑定到 Windows 窗体和 ASP.NET 服务器控件,以及如何利 用实体框架作为其他数据感知的.NET 技术的数据源。 每章都包含由该章的代码例子扩充而 来的 C#和 VB 样例项目。 ● 第 12 章“利用对象服务和 LINQ to Entities”专门讨论了如何操作对象服务 API 的 ObjectContext。该章随后演示了 ModelNameEntities 和 EntityName 对象的局部类的 使用、执行 eSQL ObjectQuery、相关实体的延迟加载或预先加载以及相关实体的 排序和过滤。 该章最后讲述了如何通过组合 QueryBuilder方法来编写 ObjectQuery、 LINQ to Entities 查询以及参数化 ObjectQuery。 ● 第13章“更新实体和复杂类型”阐述了如何对EntitySet执行创建、更新和删除(CUD) 操作,以及管理并发冲突。这一章详细介绍了 ObjectContext.ObjectStateManager及 其子对象,它们负责基于 EntityKey 唯一识别对象以及执行对象更改跟踪操作。本 章也介绍了如何进行创建和更新操作的验证、使用存储过程完成更新,以及使用复 杂类型。 ● 第 14 章“将实体绑定到数据感知控件”讲述了如何基于 ObjectContext.EntitySet 实例创建设计时数据源, 并通过拖放操作在Windows窗体中添加BindingNavigator、 BindingSource、绑定的TextBox及DataGridView。您也将学习到怎样在DataGridView 控件的ComboBox列中更新EntityReference和EntitySet值(不能直接更新EntitySet 值,必须首先删除原有值,然后才能添加一个具有所需值的新成员)。本章结尾演 示了绑定到 GridView和 DropDownList控件的 ASP.NET EntityDataSource控件的 使用。 ● 第15章“使用实体框架作为数据源”主要讲述了如何使用实体框架作为ADO.NET 数据服务框架(之前的代号“Project Astoria”仍适用)的数据源,这也是将实体框架 第一版部署为 Web 服务提供者的推荐方法(实体框架第二版将支持直接使用 WCF 进行 n 层数据访问)。该章给出的 Windows 窗体示例使用 Astoria 的.NET 3.5 客户 端库并按照 Atom出版(AtomPub 或 APP)传输格式来显示和更新实体实例。 而 Web 窗体项目则使用 AJAX 客户端库和 JSON 作为传输格式。 ADO.NET 3.5高级编程——应用LINQ & Entity Framework X 源代码 在读者学习本书中的示例时,可以手工输入所有代码,也可以使用本书附带的源代码 文件。本书使用的所有源代码都可以从本书合作站点 /或 www.tupwk.com.cn/downpage上下载。登录到站点 /,使用 Search 工具 或使用书名列表就可以找到本书。接着单击本书细目页面上的 Download Code 链接,就可 以获得所有的源代码。 注释: 由于许多图书的标题都很类似,所以按 ISBN 搜索是最简单的,本书英文版的 ISBN 是 978-0-470-18261-1。 在下载了代码后,只需用自己喜欢的解压缩软件对它进行解压缩即可。另外,也可以 进入 /dynamic/books/download.aspx 上的 Wrox 代码下载主页,查看本 书和其他 Wrox 图书的所有代码。 勘误表 尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的, 如果您在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。 通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。 请给 wkservice@vip.163.com发电子邮件, 我们就会检查您的反馈信息, 如果是正确的, 我们将在本书的后续版本中采用。 要在网站上找到本书英文版的勘误表,可以登录 ,通过 Search 框 或书名列表查找本书,然后在本书的细目页面上单击 Book Errata 链接。在这个页面上可以 查看到 Wrox 编辑已提交和粘贴的所有勘误项。完整的图书列表还包括每本书的勘误表, 网址是 /misc-pages/booklist.shtml。 要与作者和同行讨论,请加入 上的 P2P论坛。这个论坛是一个基于 Web 的系统,便于您张贴与 Wrox 图书相关的消息和相关技术,与其他读者和技术用户交流心 得。该论坛提供了订阅功能,当论坛上有新的消息时,它可以通过电子邮件给您传送感兴 趣的论题。Wrox 作者、编辑和其他业界专家和读者都会到这个论坛上来探讨问题。 在 上,有许多不同的论坛,它们不仅有助于阅读本书,还有助于 开发自己的应用程序。要加入论坛,可以遵循下面的步骤: 前 言 XI (1) 进入 ,单击 Register链接。 (2) 阅读使用协议,并单击 Agree 按钮。 (3) 填写加入该论坛所需要的信息和自己希望提供的其他信息,单击 Submit 按钮。 (4) 您会收到一封电子邮件,其中的信息描述了如何验证账户,完成加入过程。 注释: 不加入 P2P也可以阅读论坛上的消息,但要张贴自己的消息,就必须加入该论坛。 加入论坛后,就可以张贴新消息,响应其他用户张贴的消息。可以随时在 Web 上阅读 消息。如果要让该网站给自己发送特定论坛中的消息,可以单击论坛列表中该论坛名旁边 的 Subscribe to this Forum图标。 关于使用 Wrox P2P的更多信息,可阅读 P2P FAQ,了解论坛软件的工作情况以及 P2P 和 Wrox 图书的许多常见问题。要阅读 FAQ,可以在任意 P2P页面上单击 FAQ链接。