神兵利器 浅谈如何使用LINQ检索和操作数据库

开发 后端
本文将简单介绍如何使用LINQ检索和操作数据库。自.NET 3.0开始,LINQ(Language Integrated Query,整合查询语言)便逐渐出现在.NET开发的各个角落,它不仅提供了一种用于快速检索结构化标记语言(如XML)的方法,而且还非常有效地被用来处理与数据库的交互。

借助于LINQ提供的各种功能和独有的语法结构,LINQ已经被用来作为一种统一的数据库访问技术而被广泛使用,用以消除从数据访问层到数据源层出不穷的区别。通过LINQ检索,我们已经可以不用自己编写一行代码来从数据库获取到数据,LINQ和SQL之间提供了一个直接映射关系,它可以通过我们事先指定的数据库连接自动生成数据库实体类,而我们只需要通过LINQ语句操作这些实体对象就可以非常轻松地从数据库中获取到数据。当然,LINQ所生成的实体对象的功能远远不止这些,它甚至支持数据的更新和存储过程的调用,所有这些都可以通过简单的几行LINQ语句来完成,让我们真正摆脱了编写数据访问层、数据库实体类的工作。

下面就让我们来看看LINQ的神奇功能吧!

使用LINQ生成数据库实体类

Visual Studio 2008集成开发环境为我们提供了很多有用的功能来实现LINQ to SQL。为了让读者可以自行尝试本文所举的示例,读者可能需要在本地安装一个SQL Server数据库实例,Northwind是微软官方提供的一个不错的例子,如果你本地没有安装这个实例,可以去下面这个地址下载:

http://www.microsoft.com/downloads/details.aspx?FamilyID=06616212-0356-46A0-8DA2-EEBC53A68034&displaylang=en

我们在Visual Studio 2008中新建一个控制台应用程序,取名为LINQExample,然后打开Server Explorer窗口并连接到Northwind数据库。如果找不到Server Explorer窗口,可以通过View-Server Explorer菜单打开。

在Server Explorer窗口中,右键单击Data Connection节点,选择Add Connection,在弹出的窗口中选择Northwind数据库。

选择Northwind数据库

在工程中添加Northwind.dbml文件,该文件是LINQ to SQL Classes类型的文件。

添加Northwind.dbml文件

然后将Server Explorer窗口中Northwind数据库中的所有Table和Stored Procedures拖放到Northwind.dbml视图窗口中。此时,在Northwind.dbml文件中,Visual Sdutio已经自动为我们创建了数据库实体类和映射到数据库存储过程的静态方法,在后面的示例中我们可以通过LINQ语句直接使用它们。

通过LINQ语句映射

打开Class View窗口,在其中也可以看到自动生成的实体类和静态方法。

打开Class View窗口M

是不是非常方便啊?那接下来就来看看如何通过LINQ检索和修改数据。

使用LINQ检索数据

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

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

  1. using (NorthwindDataContext context =new NorthwindDataContext())   
  2. {   
  3. var results = from curstomers in context.Customers   
  4. where curstomers.City =="London"   
  5. orderby curstomers.CompanyName   
  6. select curstomers;   
  7.  
  8. foreach (var curstomers in results)   
  9. {   
  10. Console.WriteLine("Company is {0} and Contact is {1}",   
  11. curstomers.CompanyName, curstomers.ContactName);   
  12. }   
  13.  
  14. // Pause to see the output   
  15. Console.ReadLine();   

这个是执行结果:

执行结果

使用LINQ更新数据

LINQ不仅可以从数据库中检索数据,借助于NorthwindDataContext上下文对象提供的方法,我们也可以通过LINQ非常方便地将数据更新到数据库中。下面的例子展示了将数据Insert和Update到数据库并从数据库中删除数据,其中使用了LINQ中的lambda表达式用于从数据源查询数据(lambda表达式是LINQ查询语句的一种简写形式)。

  1. using(NorthwindDataContextcontext=newNorthwindDataContext())  
  2. {  
  3. //AddanewrecordandverifyitexiststhroughCount  
  4. varcustomer=newCustomer()  
  5. {  
  6. CompanyName="DramaCafe",  
  7. CustomerID="DRACA",  
  8. ContactName="TomSmith",  
  9. City="BeverlyHills",  
  10. Address="123MelrosePlace",  
  11. PostalCode="90210" 
  12. };  
  13. context.Customers.InsertOnSubmit(customer);  
  14. context.SubmitChanges();  
  15. Console.WriteLine("NumberofDRACArecords:{0}",context.Customers.Where(c=>c.CustomerID=="DRACA").Count());  
  16.  
  17. //ModifytherecordandverifyitischangedthroughCount  
  18. customer.ContactName="JoeSmith";  
  19. context.SubmitChanges();  
  20. Console.WriteLine("NumberofJoeSmithrecords:{0}",context.Customers.Where(c=>c.ContactName=="JoeSmith").Count());  
  21.  
  22. //DeletearecordandverifyitisremovedthroughCount  
  23. context.Customers.DeleteOnSubmit(customer);  
  24. context.SubmitChanges();  
  25. Console.WriteLine("NumberofDRACArecords:{0}",context.Customers.Where(c=>c.CustomerID=="DRACA").Count());  
  26.  
  27. //Pausetoseetheoutput  
  28. Console.ReadLine();  
这个是执行结果:

执行结果

使用LINQ执行存储过程

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

  1. using(NorthwindDataContextcontext=newNorthwindDataContext())  
  2. {  
  3. //Usethetenmostexpensiveproductsstoredprocedure  
  4. varresults=fromproductsincontext.Ten_Most_Expensive_Products()  
  5. selectproducts;  
  6.  
  7. foreach(varproductinresults)  
  8. {  
  9. Console.WriteLine("Productpriceis{0}",product.UnitPrice);  
  10. }  
  11.  
  12. //Pausetoseetheoutput  
  13. Console.ReadLine();  

这个是执行结果:

执行结果

LINQ检索结语

使用LINQ检索数据库确实可以为我们开发数据库应用程序带来许多的便利性,例如省去编写数据库实体类和数据库访问层的代码,但这同时也会带来一些问题!例如在大型应用项目中这将破坏整体项目的结构,而且难以做到应用层与数据访问层的松耦合结构,另外就是涉及到复杂数据库事务时LINQ往往难以应付,一个好的解决办法就是将事务移至数据库,在存储过程中解决事务问题,然后在数据访问层统一调用存储过程,不过有些非常特殊的应用层需求还是会存在问题。从这个意义上来看,LINQ仍然不可能全部替代传统意义上的数据库访问层,不过在一些小型应用或快速原型开发中,使用LINQ确实可以给我们省去很多麻烦。

还有一点需要说明的是,鉴于Visual Studio可以允许我们在Server Explorer中连接除SQL之外的其它数据库,这也就意味着我们可以通过LINQ访问其它类型的数据库。我们可以在工程中创建多个不同的dbml文件,用以连接不同类型的数据库,然后在上层使用工厂进行调用切换,就可以达到支持多数据库应用的目的。有关这一点,读者可以自己去尝试。

【编辑推荐】

  1. 使用LINQ查询泛型字典Dictionary
  2. 浅析Linq to SQL更新数据时容易忽略的问题
  3. 浅谈LINQ to SQL集成数据库语言优劣
  4. LINQ横向对比foreach方法
  5. 浅谈LINQ如何插入删除和更新数据库记录备注
责任编辑:彭凡 来源: cnblogs
相关推荐

2009-09-15 09:50:07

Linq操作数据库

2020-11-16 08:56:02

Python

2011-07-01 13:42:24

QT 数据库

2009-09-07 17:32:14

LINQ检索数据

2011-07-05 10:27:06

MySQL数据库检索排序

2023-04-27 09:36:43

2009-09-03 09:52:26

C# treeview

2011-04-19 10:20:09

数据库

2022-10-09 15:41:54

Python数据库

2009-08-24 16:46:04

C# 泛型

2009-08-04 14:52:33

Visual Web ASP.NET

2023-06-15 15:21:43

2023-12-27 13:44:00

数据库系统分布式

2009-05-08 10:15:04

LINQ插入删除

2023-12-14 15:07:31

多线程数据库代码

2021-06-29 06:25:22

Nest.jsTypeORM数据库

2016-05-11 10:09:49

数据层代码FastQuery

2023-08-08 07:47:55

编程语言MongoDB

2023-05-23 16:25:48

MyBatisSQL数据库

2009-09-14 13:30:04

Linq数据和对象
点赞
收藏

51CTO技术栈公众号