张子阳 TraceFact

Fire is the test of gold; adversity, of strong man.

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  44 随笔 :: 0 文章 :: 1023 评论 :: 56 Trackbacks


 PDF版浏览:http://files.cnblogs.com/JimmyZhang/Linq-To-Sql-Part_1-Introduction.pdf

出处:Linq To Sql(Part.1 - Introduction)

术语表:

Extension:扩展
Initializer:初始器
Expression:表达式
Features:特性
Querying Programming Model:查询编程模型
.Net Language Integrated Query:.Net 集成语言查询
Type-safty:类型安全
Compile-time:编译阶段
Extensibility Model:可扩展模型
Domain-Specific:特定域名
Object Relational Mapping:对象关系映射
Designer:设计器
Representation:表现
Entity class:实体类
Association/Relationship:联系/关系
Solution:解决方案
Conduit:管道

过去的几个月中,我写了一系列的博客随笔,讲述了即将到来的Visual Studio 和 .Net Framework “Orcas” 版本。下面是这些随笔的链接。

l         自动化属性、对象、集合初始器

l         扩展方法

l         Lambada 表达式

l         查询语法

l         匿名类型

上面这些语言特性有助于建立一种查询数据 的使用类的编程概念。我们将这种查询编程模型总称为“LINQ” – 代表的意思是:.Net 集成查询语言。

开发者可以在任何数据源中使用LINQ。他们可以在他们的编程寓言中体验一种高效的查询,可以有选择的 转换/拼装数据查询结果到任何他们想要的格式,并且,可以很容易的操作这些查询结果。支持LINQ的语言能够提供对类型安全和在编译阶段检测查询表达式的全面支持,并且,在编写LINQ 代码的时候,开发工具可以提供完全的智能提示(NOTE:就是你输入一个i,int直接就出来了,你只需要拍一下空格就可以了。)、调试和Rich refactoring 支持。

LINQ支持一种非常丰富的可扩展模型,这种模型使得为数据源建立高效的特定域名的操作变得非常便利。

.Net Framework 的“Orcas”版本(NOTE:现在已经更名为.Net Framework 3.5 和 VS2008)提供了内置的库,以使LINQ支持对象、XML和各种数据库。

LINQ TO SQL 是什么?

LINQ TO SQL 是包含在.NET Framework的“Orcas”版中中的一种 O/RM (对象关系映射),O/RM 允许你使用 .NET 的类来对关系数据库进行建模。然后,你可以使用LINQ对数据库中的数据进行查询、更新、添加、删除。

LINQ TO SQL 提供了对事务、视图、存储过程的完全支持。它同样为集成数据校验和业务层逻辑到你的数据模型中提供了一种简单的实现方式。

使用 LINQ TO SQL 对数据库进行建模

Visual Studio “Orcas”提供了一个LINQ TO SQL 设计器,以提供一种简单、可视化的方式来进行数据库到对象的建模。我的下一篇博客随笔将更加深入的使用这个设计器(你也可以下载我在一月份录制的这个视频,这个视频记录了我是如何建立一个LINQ TO SQL模型的)。

使用LINQ TO SQL设计器,我可以很容易的建立对于范例数据库“NorthWind”的表现。如图所示:

上图所示的我的LINQ TO SQL 设计来自于四个实体类:Product, Category, Order 和 OrderDetail。每个类的属性映射到相应的数据库表的字段中。每个类的实例代表了数据库中表的一行。

上面四个实体类之间的箭头代表了不同实体间的联系/关系。箭头的方向代表了这种关系是一对多的还是多对一的。强类型化的属性将根据这个添加到实体类中。举个例子,上面的Category类和Product类有一个一对多的关系。这就意味着Category类将有个“Categories”属性,这个属性是属于此Category的所有Product对象的集合。而Product类将有一个“Category”属性,这个属性指向它所属于的Category类。

在LINQ TO SQL设计器中的靠右边的长方形块中包含了与我们的数据库模型进行交互的存储过程列表。在这个范例中,我添加了一个简单的"GetProductsByCategory"存储过程。它用CategoryId作为输入参数,并且返回一个Product的实例集合。接下来让我们看看如何在代码中调用这个存储过程。

理解DataContext

当你在LINQ TO SQL设计器中按“保存”按钮的时候,Visual Studio将会维护我们建立模型的、代表着实体和数据库关系的那些类。每一个LINQ TO SQL 设计器文件将会被添加到我们的解决方案中,同时也将创建一个一个自定义的 DataContext类。这个DataContext类是一个主要的管道,我们通过它来进行对数据库的操作和查询。DataContext类将包含一些属性,这些属性代表着我们在建模时的表和我们添加的存储过程。

举例来说,下面是一个 NorthwindDataContext类,这个类严格的遵循我们在上面的设计。

LINQ TO SQL 代码示范

一旦我们使用LINQ TO SQL 设计器对我们的数据库建立了模型,我们可以轻易的编写代码来访问它。下面是一些代码范例,演示了一些基本的任务。

1)从数据库中查询Product

下面的代码使用 LINQ 查询语法去获取一系列Product对象。注意到代码是如何通过 Product/Category 多对一关系来进行查询的,仅仅筛选出那些属于“Beverage”Category的Products。

2)在数据库中更新一个Product

下面的代码演示了如何从数据库中获取一个Product,更新它的价格,然后存回数据库。

3)在数据库中插入一个新的Category和两个新的Product

下面的代码演示了如何创建一个新的Category,然后创建了两个新的Product,然后建立它们之间的联系。最后,它们全被存回数据库。

请注意,在下面我并不需要手动的设置主键/外键 关系。相反,仅仅是添加一个Product对象到Category的“Products”集合,然后通过添加这个Category对象到DataContext的“Categories”集合,LINQ TO SQL 就会知道需要为我自动维护适当的主键/外间 关系。

4)从数据库中删除Products

下面的代码示范了如何删除数据库中所有的Toy Products。

5)调用一个存储过程

下面的代码示范了如何通过调用我们之前添加的 “GetProductsByCategory”存储过程来获取Product实体,而不是通过LINQ查询语法。请注意,一旦我获取了Products结果集,我可以更新、删除他们,然后调用db.SubmitChanges()以将这些更改回传到数据库中去。

6)使用服务器端分页获取Products

下面的代码演示了作为LINQ查询的一部分,如何实现高效的服务器端数据分页。通过使用下面的Skip()和Take()操作,我们将只从数据库中返回10行—初始200行。

总结

LINQ TO SQL 提供了一种良好、清爽的方式对你应用程序中的数据层进行建模。一旦你定义好你的数据模型,你可以简单、高效的在它上面实现查询、插入、更新、删除。

希望上面的这些介绍和代码范例会帮助你满足学习更多支持的欲望。在接下来的几周里,我将会继续发表这一系列文章,更加深入地探讨 LINQ TO SQL。

posted on 2007-08-05 22:33 Jimmy Zhang 阅读(3276) 评论(11)  编辑 收藏 所属分类: Asp.Net

评论

#1楼  2007-08-06 08:39 zzticzh      
写的不错 ,支持!
  回复  引用  查看    

#2楼 [楼主] 2007-08-06 08:52 JimmyZhang      
@zzticzh

确切的说,是翻译的不错吧? :-)
  回复  引用  查看    

#3楼  2007-08-06 09:07 静水流深      
嗯,看得很明白,8错
  回复  引用  查看    

#4楼  2007-08-06 12:32 txdlf [未注册用户]
Part2 什么时候有?
  回复  引用    

#5楼 [楼主] 2007-08-06 12:42 JimmyZhang      
@txdlf

今天晚上就有了,大概10多,一般来说我翻译一篇大概2个半小时,我6点下班,7点到家,吃饭半个小时,翻译2个半小时,勘误15分钟,也就是10点半的样子。
  回复  引用  查看    

#6楼  2007-08-08 16:48 夜已醉 [未注册用户]
不错!正想找一些关于linq的crud操作的文章,多谢博主了!
  回复  引用    

#7楼  2007-10-07 20:00 ganquan [未注册用户]
可以LINQ TO Acess吗?没接触过,不过我想应该可以。
  回复  引用    

#8楼  2008-01-03 16:37 wyf [未注册用户]
看了你写的东西,比我大学时老师强百倍,很有天赋,你不是考研吗,要考就考个好点的,以后不想自己创业,就进高校当个教授,那你的业余时间就多拉,想干什么干什么,
  回复  引用    

#9楼  2008-02-22 13:42 warewing [未注册用户]
@wyf
好东西,一直听说Linq这个新名词,都不知道干什么的,看了你的文章才知道可以这么用啊!
如果换成MySql的数据库或者其它数据库是不是也换汤不换药,都可以这么创建实例呵?
  回复  引用    

#10楼 [楼主] 2008-02-22 14:16 张子阳.      
@warewing

我没试过,翻译这几篇 Linq to Sql 的文章也是一时兴起,后来工作中没有机会用到,我就没再研究了。

  回复  引用  查看