在前一些日子我在博客上写了一些关于.NET 3.x(C#3.0)的一些特性,其中也提到了一些关于LinQ的一些查询句法(语法),从今天开始我们来看看LinQ to SQL(以后简写为LinQ2SQL),就是对数据库的查询,以前叫做DLinQ。经常看到LinQ那到底是什么呢?他是Language Integrated Query的缩写,以一种类似SQL语句的形式来对对象进行操作的编程方法。
在使用到LinQ时也会用到以前提到过的一些特性,如:匿名类型,自动化属性等等......所以如果没有阅读过C#新特性的朋友可以在下面找到:
LinQ2SQL是一种ORM,它允许你通过编写.NET程序来控制或操作关系型数据库以达到查询的效果。你可以使用LinQ来检索数据库中的数据,也可以通过其进行数据的更新和添加。同时LinQ2SQL也支持事务,试图以及存储过程等等,通过VS2008(现在使用的是beta版本,下同)的LinQ2SQL设计器我们可以很容易定义一些实体类,我们可以通过添加一个新项来加入.dbml文件,并从数据库服务器窗口拖出数据表。下面我们来看看具体的例子:
下面我们来看看实际应用的一些例子(SQL四大护法<SELECT/INSERT/UPDATE/DELETE>):
1.从数据库中检索数据<SELECT>
2 ItLivesNetDataContext cntx = new ItLivesNetDataContext();
3 // 这个也可以在初始化ItLivesNetDataContext实例时直接进行初始化。
4 cntx.Connection = new SqlConnection(
5 ConfigurationManager.ConnectionStrings[ 0 ].ConnectionString);
6 var articles = from a in cntx.Articles
7 where a.CategoryID == 1
8 orderby a.PostDate descending
9 select a;
上面的代码将返回数据库Articles表中类型ID为1的所有数据,并将其按发布时间进行降序排列。其中articles其实是IEnumerable<T>的实例,这个例子的T就是Article实体类。
2.将新数据插入到数据库中<INSERT>
2 Category category = new Category { CategoryName = " CPLUSPLUS " ,IsActived = true , ParentID = 1 };
3
4 // 插入新文章,类型为C++
5 var article = new Article { Subject = " C++入门 " , Author = " 网魂小兵 " };
6
7 category.Articles.Add(article);
8
9 cntx.Categories.Add(category);
10
11 cntx.SubmitChanges();
3.更新新数据<UPDATE>
category.IsActived = true ;
category.Description = " UPDATE CSHARP! " ;
cntx.SubmitChanges();
4.删除数据库中的数据<DELETE>
2 where s.CategoryName == " CPLUSPLUS "
3 select s;
4
5 cntx.Articles.RemoveAll(delArtiles);
6 cntx.SubmitChanges();
以上是SQL四大护法的例子,例子很简单一看就能够懂就不多解释了。在数据库中我们还经常要用到检索数据库的方法那就是分页检索数据库,然而在比较大的数据时我们往往会用到存储过程来完成这一职业。下面我们来看看LinQ在分页和调用存储过程上的一些基本操作,当然将要举例的存储过程不是分页检索数据库的存储过程,代码如下:
1.分页检索Article
2 where s.CategoryName.ToUpper() == " CSHARP "
3 orderby s.PostDate descending
4 select s).Skip( 100 ).Take( 20 );
以上代码是在数据库中检索类型为C#的文章(按发表时间的降序排列)的第100后取20行记录,如果按每页20条记录算也就是第6页,其中我们用到了Skip()和Take()方法。
2.在LinQ2SQL中应用存储过程
在上面建立dbml文件时我们就通过拖拽把一个存储过程(GetParentCategories)拖到方法框中,我写这个存储过程的主要目的是获取当前类型的父类型列表。就一行代码,代码如下:
OK,今天的目的主要是从整体上来了解一下LinQ2SQL,我会在下面的博客文章中慢慢深入体会一下LinQ2SQL的乐趣,虽然在我的项目中不一定会用到这些。由于这些东东都会转换为标准的SQL语句在通过数据库引擎进行查询,所以效率上我想应该有所影响,不过现在只在于多多了解和学习.NET 3.x(C#3.0)给我们带来的新特性。
(友情提醒:如果你使用前缀或者其他来对你的数据库表格进行命名,在建立dbml文件时一定要将其name属性改写成在C#编程中要用到的名称,否则在你编程时就会出现很难看的代码!!!)