[LinQ2SQL一]SQL四大护法在LinQ中的应用

在前一些日子我在博客上写了一些关于.NET 3.x(C#3.0)的一些特性,其中也提到了一些关于LinQ的一些查询句法(语法),从今天开始我们来看看LinQ to SQL(以后简写为LinQ2SQL),就是对数据库的查询,以前叫做DLinQ。经常看到LinQ那到底是什么呢?他是 Language Integrated Query 的缩写,以一种类似SQL语句的形式来对对象进行操作的编程方法。

    在使用到LinQ时也会用到以前提到过的一些特性,如:匿名类型,自动化属性等等......所以如果没有阅读过C#新特性的朋友可以在下面找到:
    
    [.NET 3.x新特性一]自动属性,对象初始化及集合初始化


     [.NET 3.x新特性二]扩展方法

     [.NET 3.x新特性三]Lambda表达式

     [.NET 3.x新特性四]LinQ查询语法

     [.NET 3.x新特性五]匿名类型

    LinQ2SQL是一种ORM,它允许你通过编写.NET程序来控制或操作关系型数据库以达到查询的效果。你可以使用LinQ来检索数据库中的数据,也可以通过其进行数据的更新和添加。同时LinQ2SQL也支持事务,试图以及存储过程等等,通过VS2008(现在使用的是beta版本,下同)的LinQ2SQL设计器我们可以很容易定义一些实体类,我们可以通过添加一个新项来加入.dbml文件,并从数据库服务器窗口拖出数据表。下面我们来看看具体的例子:


     我们定义两个实体类,Artile和Category,我们也可以把存储过程拖到方法的窗口中,由于我们的存储过程和数据表的命名可能带有前缀或其他标识,我们可以查看属性窗口将他们的name属性改掉我们容易识别的名称。我们打开Designer.cs那个文件看一下,是不是生成了几个类,其中一个最重要的是以DataContext为后缀那个类(他以当前dbml文件名加DataContext为名称的类),他是这个LinQ的上下文,我们可以通过他来执行我们的操作。而上面两个是外键关系,他还生成了一个关系类,而且在Category类中好有一个Article的集合,在Article中也有一个关联属性,在赋值时还会对键值类型进行判断。

    下面我们来看看实际应用的一些例子(SQL四大护法<SELECT/INSERT/UPDATE/DELETE>):

    1.从数据库中检索数据<SELECT>

1               // 三个重载(),(string connectionString),(IDbConnection connection)
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>

 1               // 插入新类型C++
 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 category  =  cntx.Categories.Single(p  =>  p.CategoryName.ToUpper()  ==   " CSHARP " );

            category.IsActived 
=   true ;
            category.Description 
=   " UPDATE CSHARP! " ;

            cntx.SubmitChanges();

    4.删除数据库中的数据<DELETE>

1              var delArtiles  =  from s  in  cntx.Articles
2                               where s.CategoryName  ==   " CPLUSPLUS "
3                               select s;
4 
5              cntx.Articles.RemoveAll(delArtiles);
6              cntx.SubmitChanges();

    以上是SQL四大护法的例子,例子很简单一看就能够懂就不多解释了。在数据库中我们还经常要用到检索数据库的方法那就是分页检索数据库,然而在比较大的数据时我们往往会用到存储过程来完成这一职业。下面我们来看看LinQ在分页和调用存储过程上的一些基本操作,当然将要举例的存储过程不是分页检索数据库的存储过程,代码如下:

    1.分页检索Article

1              var pagedArticles  =  (from s  in  cntx.Articles
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)拖到方法框中,我写这个存储过程的主要目的是获取当前类型的父类型列表。就一行代码,代码如下:

1      var categories  =  cntx.GetParentCategories( 1 );

    OK,今天的目的主要是从整体上来了解一下LinQ2SQL,我会在下面的博客文章中慢慢深入体会一下LinQ2SQL的乐趣,虽然在我的项目中不一定会用到这些。由于这些东东都会转换为标准的SQL语句在通过数据库引擎进行查询,所以效率上我想应该有所影响,不过现在只在于多多了解和学习.NET 3.x(C#3.0)给我们带来的新特性。

    (友情提醒:如果你使用前缀或者其他来对你的数据库表格进行命名,在建立dbml文件时一定要将其name属性改写成在C#编程中要用到的名称,否则在你编程时就会出现很难看的代码!!!)

本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2007/09/11/linq2sql_sql_select_insert_update_delete_paging.html,如需转载请自行联系原作者