注册 登录
编程论坛 F#论坛

浅谈如何使用LINQ检索和操作数据库

303770957 发布于 2010-02-08 14:12, 7718 次点击
         计算机技术更新速度太快了,老技术还没有明白多少新技术又层出不穷。作为一个刚刚涉入计算机领域不久的我,实在是感觉需要加快速度跟上社会进步的步伐,跟上新型技术的发展脚步。微软可真不愧是IT行业的领头人,他推出的软件推动了硬件的迅速发展,想必大家也知道微软推出的Vista 、windows server 2008 、windows 7 这些操作系统对硬件的要求都是比较高的,一般用户要想安装使用必须要将计算机的硬件设施升级。从这一点不难说明这是个不争的事实。

        没办法,为了适应社会的发展需求,本人也不得不继续学习。俺学习微软的 Visual studio 200X 也有段时间了,可总是感觉学不明白没掌握多少。以前的Visual studio 2003、Visual studio 2005还没有怎么学明白呢,Visual studio 2008 又吵得不得了,前些天装上了windows server 2008(操作系统)  + Visual studio 2008(开发工具) +SQL server 2008(数据库)据说是完美绝配。装上之后用起来确实不错,呵呵。最近有在研究VS2008新增功能时遇到了很多问题,突然间发现自己落后了很多,心里甚是惭愧,到了该抓紧时间学习学习新技术的时候了。别的不说了,还是谈谈学习LINQ(Language INtegrated Query)的心得吧。

         借助于LINQ提供的各种功能和独有的语法结构,LINQ已经被用来作为一种统一的数据库访问技术而被广泛使用,用以消除从数据访问层到数据源层出不穷的区别。

         通过LINQ检索,已经可以不用自己编写一行代码来从数据库获取到数据,LINQ和SQL之间提供了一个直接映射关系,它可以通过事先指定的数据库连接自动生成数据库实体类,而我们只需要通过LINQ语句操作这些实体对象就可以非常轻松地从数据库中获取到数据。

        当然,LINQ所生成的实体对象的功能远远不止这些,它甚至支持数据的更新和存储过程的调用,所有这些都可以通过简单的几行LINQ语句来完成,真正摆脱了编写数据访问层、数据库实体类的工作。

 

1.使用LINQ生成数据库实体类

         Visual Studio 2008集成开发环境提供了很多有用的功能来实现LINQ to SQL。

下面通过一个SQL Server数据库实例,Northwind是微软官方提供的一个不错的例子。
【1】在Visual Studio 2008中新建一个控制台应用程序,取名为LINQExample,然后打开Server Explorer窗口并连接到Northwind数据库。如果找不到Server Explorer窗口,可以通过View-Server Explorer菜单打开。
【2】在Server Explorer窗口中,右键单击Data Connection节点,选择Add Connection,在弹出的窗口中选择Northwind数据库。
【3】在工程中添加Northwind.dbml文件,该文件是LINQ to SQL Classes类型的文件。
【4】然后将Server Explorer窗口中Northwind数据库中的所有Table和Stored Procedures拖放到Northwind.dbml视图窗口中。

         到此为止,Northwind.dbml文件中,Visual Sdutio已经自动创建了数据库实体类和映射到数据库存储过程的静态方法,后面可以通过LINQ语句直接使用它们。打开Class View窗口,在其中也可以看到自动生成的实体类和静态方法。

 

2.使用LINQ检索数据

        LINQ检索提供的语法结构与SQL比较接近,使用起来更加容易上手。Northwind.dbml自动包装了一个上下文对象NorthwindDataContext类,其中包括了在Northwind数据库中要使用的所有实体类和存储过程映射方法,同时还提供了操作表数据的方法,使用时不需要去关心它是如何连接数据库并进行底层数据操作的。事实上,Northwind.dbml文件中已经包含了这些基础设施!使用记事本打开Northwind.dbml,可以发现这是一个纯粹的XML结构化文件,里面包含了数据库连接字符串和一些数据库实体类的映射关系,同时,Northwind.designer.cs文件中也做了很多基础性的工作,感兴趣的话可以自行研究其中的代码,或许对解决实际问题有所帮助。

 

下面的这个例子展示了通过LINQ检索Northwind数据库中Customers表City等于London的数据,并在Command窗口中打印出来。

…………………
using (NorthwindDataContext context =new NorthwindDataContext())
{   
      var results = from curstomers

                            in context.Customers  

                            where curstomers.City =="London"   

                            orderby    

                            select curstomers;   
      foreach (var curstomers in results)  
     {  
 
            Console.WriteLine("Company is {0} and Contact is {1}",   , curstomers.ContactName);  

       }   
           Console.ReadLine();    // Pause to see the output

}

 

3.使用LINQ更新数据

        LINQ不仅可以从数据库中检索数据,借助于NorthwindDataContext上下文对象提供的方法,也可以通过LINQ非常方便地将数据更新到数据库中。

下面的例子展示了将数据Insert和Update到数据库并从数据库中删除数据,其中使用了LINQ中的lambda表达式用于从数据源查询数据(lambda表达式是LINQ查询语句的一种简写形

式)。

………………
using(NorthwindDataContext context=new NorthwindDataContext())
 {  

       //Add a new record and verify it exists through Count  
       var customer=new Customer()  
      {  
           CompanyName="DramaCafe",  
           CustomerID="DRACA",  
           ContactName="TomSmith",
           City="BeverlyHills",
           Address="123MelrosePlace",
           PostalCode="90210"
     };  
      context.Customers.InsertOnSubmit(customer);  
      context.SubmitChanges();  
      Console.WriteLine("Number of DRACA records:{0}",context.Customers.Where(c=>c.CustomerID=="DRACA").Count());

       //Delete a record and verify it is removed through Count  
       context.Customers.DeleteOnSubmit(customer);
       context.SubmitChanges();  
       Console.WriteLine("Number of DRACA records:{0}",context.Customers.Where(c=>c.CustomerID=="DRACA").Count());   
       //Pause to see the output  
      Console.ReadLine();  
}


4.使用LINQ执行存储过程

        Northwind.dbml在生成数据库实体类的同时,也生成了映射数据库存储过程的静态方法,通过NorthwindDataContext上下文对象可以直接在LINQ中调用这些存储过程。
下面的例子展示了在LINQ中调用Ten_Expensive_Products存储过程,用于检索Products表中单价最贵的10中商品的名称。

………………

using(NorthwindDataContext context=new NorthwindDataContext())
 {
      //Use the ten most expensive products stored procedure

       var results=from products

                          in context.Ten_Most_Expensive_Products()  

                          select products;   
      foreach(var product in results)  
     {  
            Console.WriteLine("Product priceis{0}",product.UnitPrice);  
      }  
     //Pause to see the output  
      Console.ReadLine();
}


5.LINQ检索结语

        使用LINQ检索数据库确实可以为开发数据库应用程序带来许多的便利性,例如省去编写数据库实体类和数据库访问层的代码,但这同时也会带来一些问题!例如在大型应用项目中这将破坏整体项目的结构,而且难以做到应用层与数据访问层的松耦合结构,另外就是涉及到复杂数据库事务时LINQ往往难以应付,一个好的解决办法就是将事务移至数据库,在存储过程中解决事务问题,然后在数据访问层统一调用存储过程,不过有些非常特殊的应用层需求还是会存在问题。从这个意义上来看,LINQ仍然不可能全部替代传统意义上的数据库访问层,不过在一些小型应用或快速原型开发中,使用LINQ确实可以省去很多麻烦。还有一点需要说明的是,鉴于Visual Studio可以允许在Server Explorer中连接除SQL之外的其它数据库,这也就意味着可以通过LINQ访问其它类型的数据库。可以在工程中创建多个不同的dbml文件,用以连接不同类型的数据库,然后在上层使用工厂进行调用切换,就可以达到支持多数据库应用的目的。

5 回复
#2
bygg2010-02-08 17:34
很详细,太激动了
#3
misswang2010-03-11 21:00
I Like,Thanks!
#4
天马行空12010-07-24 16:03
不错,很详细
#5
liuliang97672010-10-13 22:17

http://www.
.net 开发工程师
ss
上海盛大网络发展有限公司
公司类型:民营公司 公司规模: ss
发布时间 :2010-09-28 工作年限 :1-3年(含) 工作方式 :全职 薪金待遇 :面议 性别要求 :不限 学历要求 :本科 招聘人数 :5 到期时间 :2010-10-28 户口要求 :无要求
#6
gu_tong20082011-07-15 15:29
是个高手!
1