[翻译]Pro C# 2008 and the .NET 3.5 Platform, Fourth Edition 第二十四章 LINQ API编程(三)
2008-09-14 11:31
597 查看
本章翻译目的为学习之用,英文版权属原作者所有,中文版权根据turingbook的贴子归图灵,如有侵权,请告知删除,禁止用于商业用途!在此特别鸣谢图灵的傅老师(本章翻译的贴出征得她的同意)和杨福川(为大家介绍了这本好书)。本人翻译水平有限,错误之处难免望大家批评指正!本文仅摘出一部分。
LINQ to SQL编程
LINQ to SQL是一种API,它把规范的LINQ查询表达式运用到关系型数据库中。LINQ to SQL提供多种类型(在System.Data.Linq.dll数据集中),促进了代码和物理数据库引擎之间的沟通。
LINQ to SQL的主要目标是维持关系型数据库和与之交互的编程逻辑之间的一致性。例如,使用强类型LINQ查询胜于用一大串的字符来表示数据库查询。同时,用标准的面向对象编程技术和数据交互,胜于把关系型数据作为记录流来处理。假定LINQ to SQL允许在C#代码基中直接集成数据访问,那么需要手工建立多个自定义类和隐藏ADO.NET实现的数据访问库的代码量就会极大地缩小。
在用LINQ to SQL编程过程中,看不到任何使用ADO.NET类的痕迹,比如有SqlConnection,SqlCommand,或者SqlDataAdapter。用LINQ查询表达式,实体类(被简单定义)和DataContext类,就能够实现所有预期的数据操作(增删改查),同时定义事务上下文,定义新数据库实例(或者是整个数据库),调用存储过程,和处理其他数据库为核心的活动。
甚者,LINQ to SQL类(像DataContext)可被开发成为集成到标准的ADO.NET数据类型。例如,一个DataContext重载的构造函数和输入一个IDbConnection相关的对象,它调用ADO.NET链接对象支持的公共接口。在这种方式下,已有的ADO.NET数据访问库可以和C#2008 LINQ查询表达式集成,反之亦然。实际上,正如微软关注的那样,LINQ to SQL是ADO.NET家庭中的新成员。
......
DataContext类作用
一旦定义了实体类,然后就可以用DataContext类来传递查询表达式给关系数据型库。与LINQ to SQL相关的类型主要负责把LINQ查询表达式翻译成恰当的SQL查询同时与特定的数据库交互。在某些方面,DataContext看起来就像一个ADO.NET链接对象,因为它需要一个链接字符串。但是,和典型的链接对象不同的是,DataContext类型有多个成员,它们会把查询表达式的结果与特定的实体类进行匹配。
甚者,DataContext类型定义工厂模式来获取代码中定义的实体类实例。一旦获取实体类的实例,就可以根据需要自由地去改变它的状态,比如添加和更新记录,并提交修改的对象用于处理。在这种情况下,DataContext与ADO.NET数据适配器类型非常相似。
一个简单的LINQ to SQL例子
在进行进一步的研究之前,看一个运用LINQ to SQL和第22章创建的AutoLot数据库库存表交互的例子。这个例子中,不会用到AutoLotDAL.dll库,取而代之的是手工编码。创建一个新的控制台程序命名为SimpleLinqToSqlApp并引用System.Data.Linq.dll数据集。
然后,插入一个新的C#类文件并命名为Inventory.cs。该文件定义我们的实体类,它需要配备多个以LINQ为核心的属性;请确保已经导入了System.Data.Linq.Mapping和System.Data.Linq命名空间。当一切准备就绪,下面就是Inventory类的定义:
LINQ to SQL编程
LINQ to SQL是一种API,它把规范的LINQ查询表达式运用到关系型数据库中。LINQ to SQL提供多种类型(在System.Data.Linq.dll数据集中),促进了代码和物理数据库引擎之间的沟通。
LINQ to SQL的主要目标是维持关系型数据库和与之交互的编程逻辑之间的一致性。例如,使用强类型LINQ查询胜于用一大串的字符来表示数据库查询。同时,用标准的面向对象编程技术和数据交互,胜于把关系型数据作为记录流来处理。假定LINQ to SQL允许在C#代码基中直接集成数据访问,那么需要手工建立多个自定义类和隐藏ADO.NET实现的数据访问库的代码量就会极大地缩小。
在用LINQ to SQL编程过程中,看不到任何使用ADO.NET类的痕迹,比如有SqlConnection,SqlCommand,或者SqlDataAdapter。用LINQ查询表达式,实体类(被简单定义)和DataContext类,就能够实现所有预期的数据操作(增删改查),同时定义事务上下文,定义新数据库实例(或者是整个数据库),调用存储过程,和处理其他数据库为核心的活动。
甚者,LINQ to SQL类(像DataContext)可被开发成为集成到标准的ADO.NET数据类型。例如,一个DataContext重载的构造函数和输入一个IDbConnection相关的对象,它调用ADO.NET链接对象支持的公共接口。在这种方式下,已有的ADO.NET数据访问库可以和C#2008 LINQ查询表达式集成,反之亦然。实际上,正如微软关注的那样,LINQ to SQL是ADO.NET家庭中的新成员。
......
DataContext类作用
一旦定义了实体类,然后就可以用DataContext类来传递查询表达式给关系数据型库。与LINQ to SQL相关的类型主要负责把LINQ查询表达式翻译成恰当的SQL查询同时与特定的数据库交互。在某些方面,DataContext看起来就像一个ADO.NET链接对象,因为它需要一个链接字符串。但是,和典型的链接对象不同的是,DataContext类型有多个成员,它们会把查询表达式的结果与特定的实体类进行匹配。
甚者,DataContext类型定义工厂模式来获取代码中定义的实体类实例。一旦获取实体类的实例,就可以根据需要自由地去改变它的状态,比如添加和更新记录,并提交修改的对象用于处理。在这种情况下,DataContext与ADO.NET数据适配器类型非常相似。
一个简单的LINQ to SQL例子
在进行进一步的研究之前,看一个运用LINQ to SQL和第22章创建的AutoLot数据库库存表交互的例子。这个例子中,不会用到AutoLotDAL.dll库,取而代之的是手工编码。创建一个新的控制台程序命名为SimpleLinqToSqlApp并引用System.Data.Linq.dll数据集。
然后,插入一个新的C#类文件并命名为Inventory.cs。该文件定义我们的实体类,它需要配备多个以LINQ为核心的属性;请确保已经导入了System.Data.Linq.Mapping和System.Data.Linq命名空间。当一切准备就绪,下面就是Inventory类的定义: