微网站制作方案,网站推广的目的是什么,石家庄住建局网站,企业名称预先核准网上申请From: http://developer.51cto.com/art/200904/120915.htm 作者写下这篇文章的主要目的不是“一口吃成个胖子”让大家一次就学会LINQ to SQL。而是从不同的方面帮助大家正确理解#xff0c;所以这里提到的快速的含义是提高效率#xff0c;而不是单纯为了学习的速度。 最近接连…From: http://developer.51cto.com/art/200904/120915.htm 作者写下这篇文章的主要目的不是“一口吃成个胖子”让大家一次就学会LINQ to SQL。而是从不同的方面帮助大家正确理解所以这里提到的快速的含义是提高效率而不是单纯为了学习的速度。 最近接连遇到几个朋友问我同一个问题就是关于.NET平台上ORM框架的选择。我想在这个讲求 效率的时代谁也不想手写SQL或存储过程去访问数据库了。大家都知道在Java平台上ORM 这一块基本是Hibernate的天下。当然相对轻量级的iBatis也有不错的表现。
不过谈到.NET平台ORM框架似乎相对混乱了点。很多朋友问我的时候往往会这样问 NHibernate、NBear和Castle该选择哪个而当我反问为什么不适用微软自带的Linq to SQL 呢对方经常会迷茫和不解。
我觉得这是个很奇怪的现象。依照我个人的实践我认为当需要快速构建一个中小型项目时 Linq to SQL是一个很好的选择。你至少有以下理由可以选择它
i. 它是微软自己的产品和.NET平台有着天生的适应性。如果你使用.NET Framework3.5和 VS2008开发环境它本身就集成在里面了同时VS2008对于Linq to SQL给予了诸多方便的支持 。使用它你不仅在开发和部署时不用考虑第三方库更可以尽情享受VS2008带来的种种方便 。
ii. 上手十分容易使用十分轻松通常你不需要编写一行代码也不用写任何XML配置 完全通过可视化拖拽就能完成ORM层的构建。
iii. 功能丰富使用便捷。当轻松构建好ORM层后你就可以更轻松的操纵数据库了。Linq to SQL提供了丰富的功能完全可以满足日常数据访问的需求。使用方法也非常简单、灵活。
有这么好的理由我真想不通为什么那么多人不愿去选择它。我想来想去也许有两个重要 原因一是把LINQ和Linq to SQL混为一谈了二是受前段时间“LINQ已死”的误导觉得微软 已经抛弃Linq to SQL了。关于这两点我就不细说了简略澄清一下
首先LINQ是从.NET Framework3.0开始.NET平台上引入的一种新式语言特性狭义一点 你可以讲它理解成一种新式语法主要是针对迭代数据操作的所以也许LINQ叫做“数据 迭代引擎Data Iterative Engine”更合适之所以不着样命名我想微软可能不愿意让自 己产品的简写为“DIE”吧。:-)而Linq to SQL是LINQ在数据库访问方面的一个应用框架完全 是两码事。
其次关于微软会不会放弃Linq to SQL客观说可能会因为微软下一步主推的ORM解决 方案是Entity Framework。不过这并不妨碍你学习使用Linq to SQL原因如下第一考虑到 兼容性问题微软绝对不会把Linq to SQL从.NET Framework中拿掉的所以你不用怕现在用 Linq to SQL写的程序以后不能运行了。第二即使微软不更新Linq to SQL了但它现在的功 能已经足够满足我们日常需要了相比重量级的Entity Framework如果你只是做一个中小 型项目并且很注重开发效率和学习曲线为什么不选择可爱的Linq to SQL呢
好的上面废话说了不少下面正式开始吧。本文不是一篇关于Linq to SQL的大百科写 本文的目的是引导大家快速上手Linq to SQL所以不可能面面俱到去讲解Linq to SQL。不 过根据80-20定律学会了本文的内容基本就可以应付80%的工作了。另外延续我一贯的风 格本文将通过案例的方式帮大家上手Linq to SQL。案例是一个“公告发布程序”。下面我们 开始
Step1建立数据库
在使用Linq to SQL前我们要将相应的数据库建好。在这个Demo中使用的数据 库是SQL Server Express 2005。
我们首先建立一个叫的数据库MyBulletin及两个数据表Category和Bulletin分别表示 公告的分类和公告建立方法不再赘述。至于两个表的具体字段请参看图1。 图1、数据表结构
其中Category和Bulletin存在一个一对多的关联表示一个分类下可以有多条公告。
Step2建立Linq to SQL Classes文件
数据建好后我们需要建立Linq to SQL Classes文件。这种文件是Linq to SQL框架的主要 文件后面自动生成的实体类和ORM代码都存在于这个文件中。
我们打开VS2008新建一个C# Class Labrary工程名称为LinqToSqlDemo.Orm建好后在 工程上单击右键选择“Add”-“New Item”在文件类型中选择“Linq to SQL Classes ”文件名命名为“DataClasses.dbml”如图2所示。 图2、新建Linq to SQL Classes文件 Step3根据数据库表自动生成代码
当建好Linq to SQL Classes后VS主界面中自动打开了这个文件。可以看到这 个文件实际是一个设计文件目前还不包含任何代码和元素。下一步就是利用我们刚才的数据 库自动生成ORM代码了。
打开Server Explorer面板。一般它位于VS的左上角如果没有请到View菜单中去打开。 然后在Date Connections上右键单击选择“Add Connection”从这里添加对数据库 MyBulletin的连接。 图3、添加数据库连接
如图3所示在Server name中填入SQL Server数据库服务的名字如果使用的是SQL Server Express 2005服务名一般是“计算机名\SQLEXPRESS”的格式然后在“Select or enter a database name”中选择MyBulletin单击“OK”就连上我们所需的数据库了。
这时展开这个连接下的Tables节点应该能看到Category和Bulletin两个表选中两个表 将它们拖到DataClasses.dbml的设计区就会看到如图4所示的样子。 图4、设计视图
然后按CtrlS保存OKORM构建完了
没有骗你所有需要的代码已经生成完成现在可以使用它们操作MyBulletin数据库了。不 要怀疑Linq to SQL使用起来就是这么轻松加愉快不需要写一行代码也不需要写一个XML 字符ORM就构建完了
我知道你没看到生成的东西可能不太放心那么你可以在Solution Explorer里展开 DataClasses.dbml节点看到里面的DataClasses.designer.cs文件没打开它里面就是刚才 自动生成的代码我们的数据访问操作就靠这些代码了。另外顺表提一下数据库的连接字符 串放在工程根目录下的app.config文件里这也是自动生成的打开它就可以看到连接字符 串。以后如果要修改连接字符串就修改这里。
好了ORM构建好了下面我们看看怎么用。
Step4使用Linq to SQL访问数据库
我们首先新建一个工程。为了简单起见我们就直接建立一个C# Console Application测试 我们的ORM吧。将这个工程命名为LinqToSqlDemo.Test。当然建好工程后不要忘了添加对工 程LinqToSqlDemo.Orm的引用还要添加对“System.Data.Linq”命名空间的引用。
然后我们打开Program.cs文件将其中的内容替换为如下测试代码。 using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.Linq;
using System.Text;using LinqToSqlDemo.Orm;namespace LinqToSqlDemo.Test
{class Program{private static DataClassesDataContext dataContext new DataClassesDataContext();private static void Output(){//输出分类信息foreach (Category c in dataContext.Categories){Console.WriteLine(分类 c.ID c.Name);}//输出体育新闻下的公告信息Category categorySport dataContext.Categories.Single(c c.Name 体育新闻);foreach (Bulletin b in categorySport.Bulletins){Console.WriteLine(标题 b.Title);Console.WriteLine(内容 b.Content);Console.WriteLine(发布日期 b.Date);Console.WriteLine(所属分类 b.Category1.Name);}}private static void TestInsert(){//生成分类实体类Category category1 new Category(){Name 国际要闻};Category category2 new Category(){Name 体育新闻};Category category3 new Category(){Name 财经快报};//生成公告实体类Bulletin bulletin1 new Bulletin(){Content 曼联晋级冠军杯四强,Date DateTime.Now,Title 曼联晋级冠军杯四强};Bulletin bulletin2 new Bulletin(){Content 18:00直播亚冠首尔VS山东敬请期待,Date DateTime.Now,Title 18:00直播亚冠首尔VS山东};//将公告加入相应分类category2.Bulletins.Add(bulletin1);category2.Bulletins.Add(bulletin2);//加入数据库dataContext.Categories.InsertOnSubmit(category1);dataContext.Categories.InsertOnSubmit(category2);dataContext.Categories.InsertOnSubmit(category3);dataContext.SubmitChanges();}private static void TestDelete(){dataContext.Categories.DeleteOnSubmit(dataContext.Categories.Single(c c.Name 国际要闻));dataContext.SubmitChanges();}private static void TestUpdate(){Category categoryFinance dataContext.Categories.Single(c c.Name 财经快报);categoryFinance.Name 财经新闻;dataContext.SubmitChanges();}static void Main(string[] args){Console.WriteLine(Linq to SQL 测试);Console.WriteLine();Console.WriteLine(测试Insert);Console.WriteLine();TestInsert();Output();Console.WriteLine(测试Delete);Console.WriteLine();TestDelete();Output();Console.WriteLine(测试Update);Console.WriteLine();TestUpdate();Output();Console.ReadLine();}}
} 一下子看不懂上述代码页没有关系稍候我们会解释一下。现在我们先来看运行结果 图5、测试程序运行结果
我们先来看看这段测试程序做了什么事。刚开始数据库是空的我们首先插入三个分类 并在“体育新闻”下插入两条公告这是对Insert的测试。接着我们删除了“国际要闻”分 类这是对Delete的测试。然后我们将“财经快报”改为“财经新闻”这是对Update测试 。另外整个过程的输出当然是对Select的测试。这样数据库基本的操作都测试过了。从输 出结果来看我们的ORM组件运行很顺利程序输出正确。
程序分析
经过简单的四步我们就完成了通过Linq to SQL操作数据库的过程。下面我们对 测试代码进行一个简要的分析帮助朋友们学会Linq to SQL操作数据库的基本方法。
取得数据库Gateway
要操作数据库我们首先要获得一个DataContext对象这个对象相当于一个数据 库的Gateway所有的操作都是通过它进行的。这个对象的名字是“Linq to SQL Classes文件 名‘DataContext’”这里就是DataClassesDataContext了。它和普通对象一样直接实 例化就行了。在Demo里我将它实例化为一个静态变量。
取得DataContext对象后每个数据表就会映射到其一个集合属性例如Category表映射到 dataContext.Categories这是一个集合属性每一个元素是一个实体类代表此表中的一条 记录。实体类名和表名相同。实体类的字段自然就映射到对应表的字段。
还有一点需要注意数据库中的一对多关系在Linq to SQL生成代码时会自动表示到类结 构中。并且这种关联是双向的。例如Category与Bulletin的一对多关系到了类结构中 反映成如下形式在Category类中有一个名为Bulletins的集合属性内容是所有属于此 Category的Bulletin对象的引用。而在Bulletin类中也会有个Category1属性由于Category 这个名字被我们用了所以这个关联属性自动加了个“1”其内容是此Bulletin所属 Category对象的引用。
Insert操作
Insert用于向数据库添加记录。一般情况下使用“DataContext.表映射集 合.InsertOnSubmit(实体类)”的方式就可以完成Insert操作。不过这里要注意一点由于Linq to SQL使用了“Unit of Work”模式所以对数据库的操作不会立即提交到数据库而要调 用DataContext的SubmitChanges方法所有改动才会被提交到数据库。
Delete操作
Delete操作用于从数据库中删除记录。表映射集合的DeleteOnSubmit方法可以实 现这个操作。这个方法需要一个参数就是要删除的实体类这里不能直接传个ID去删除要 首先通过ID找到相应实体类传给DeleteOnSubmit再删除。当然最后不要忘了SubmitChanges。
Update操作
Update操作用于更新数据库中某已存在记录的信息。在Linq to SQL中Update操 作就是首先加载相应的实体类修改其相应字段后SubmitChanges就可以了。
Select操作
Select操作用于从数据库中返回指定的记录。在Linq to SQL中查询结果都是以实体类或 实体类集合的方式返回的。其中实体类集合并不是List如果想转为List只需在返回结果上 调用ToList方法即可。
如果是查询单一记录建议使用表映射集合的Single方法。至于查询参数建议采用lambda 表达式。如果你对lambda表达式不熟可以参考这里http://msdn.microsoft.com/zh- cn/library/bb397687.aspx
其它相关示例代码
常用Select操作举例
取得单个记录ID为3的分类 RETURNDATACONTEXT.CATEGORIES.SINGLE(CC.ID3;
取得全部记录全部分类 RETURNDATACONTEXT.CATEGORIES;
得部分记录所属分类ID为3的公告按ID降序排列 RETURNFROMBorderbyb.IDdescending selectb;
取得部分记录并分页最后转换为List所属分类ID为3的公告并分页pageSize为每页多 少条记录pageNo为第几页 varbulletinsfrombINDATACONTEXT.BULLETINSorderbyb.IDdescending selectb;
总结
好了这篇文章就到这里了。希望能帮助大家快速上手Linq to SQL。关于Linq to SQL还 有许多丰富的功能和细节问题篇幅原因不能详述各位可以参考相关资料。
编者附注
网友wiken chan在跟着程序写了一遍后发现文中代码部分表名部分均由出错与本文介绍中建立的表名有出入并进行了更正测试。在此向网友wiken chan表示感谢。 using System;
using System.Collections.Generic;
using System.Data.Linq;
using System.Linq;
using System.Text;
using LinqToSqlDemo.Orm;
namespace LinqToSqlDemo.Test
{ class Program { private static DataClassesDataContext dataContext new DataClassesDataContext(); private static void Output() { //输出分类信息 foreach (Category c in dataContext.Category) { Console.WriteLine(分类 c.ID c.Name); } //输出体育新闻下的公告信息 Category categorySport dataContext.Category.Single(c c.Name 体育新闻); foreach (Bulletin b in categorySport.Bulletin) { Console.WriteLine(标题 b.Title); Console.WriteLine(内容 b.Content); Console.WriteLine(发布日期 b.Date); Console.WriteLine(所属分类 b.Category1.Name); } } private static void TestInsert() { //生成分类实体类 Category category1 new Category() { Name 国际要闻 }; Category category2 new Category() { Name 体育新闻 }; Category category3 new Category() { Name 财经快报 }; //生成公告实体类 Bulletin bulletin1 new Bulletin() { Content 曼联晋级冠军杯四强, Date DateTime.Now, Title 曼联晋级冠军杯四强 }; Bulletin bulletin2 new Bulletin() { Content 18:00直播亚冠首尔VS山东敬请期待, Date DateTime.Now, Title 18:00直播亚冠首尔VS山东 }; //将公告加入相应分类 category2.Bulletin.Add(bulletin1); category2. Bulletin.Add(bulletin2); //加入数据库 dataContext.Category.InsertOnSubmit(category1); dataContext. Category.InsertOnSubmit(category2); dataContext. Category.InsertOnSubmit(category3); dataContext.SubmitChanges(); } private static void TestDelete() { dataContext.Category.DeleteOnSubmit(dataContext.Category.Single(c c.Name 国际要闻)); dataContext.SubmitChanges(); } private static void TestUpdate() { Category categoryFinance dataContext.Category.Single(c c.Name 财经快报); categoryFinance.Name 财经新闻; dataContext.SubmitChanges(); } static void Main(string[] args) { Console.WriteLine(Linq to SQL 测试); Console.WriteLine(); Console.WriteLine(测试Insert); Console.WriteLine(); TestInsert(); Output(); Console.WriteLine(测试Delete); Console.WriteLine(); TestDelete(); Output(); Console.WriteLine(测试Update); Console.WriteLine(); TestUpdate(); Output(); Console.ReadLine(); } }
}