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

 时间:2012-09-13 22:31:06 贡献者:lldh70

导读:作范文网小编为大家带来关于如何使用LINQ检索和操作数据库,如何使用linq检索和操作数据库的内容希望大家喜欢。

如何使用linq检索和操作数据库
如何使用linq检索和操作数据库

如何使用 LINQ 检索和操作数据库日期:2009 年 7 月 10 日 作者: 人气: 35 查看:[大字体 中字体 小字体]借助于 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-035 6-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.dbml 文件,该文件是 LINQ to SQL Classes 类型的文 件。

然后将 Server Explorer 窗口中 Northwind 数据库中的所有 Table 和 Stored Procedures 拖放到 Northwind.dbml 视图窗口中。

此时,在 Northwind.dbml 文 件中,Visual Sdutio 已经自动为我们创建了数据库实体类和映射到数据库存储 过程的静态方法,在后面的示例中我们可以通过 LINQ 语句直接使用它们。

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

是不是非常方便啊?那接下来就来看看如何通过 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. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.{ var results = from curstomers in context.Customerswhere curstomers.City =="London" orderby curstomers.CompanyName select curstomers; foreach (var curstomers in results) { Console.WriteLine("Company is {0} and Contact is {1}", curstomers.CompanyName, curstomers.ContactName); } // Pause to see the output Console.ReadLine(); }这个是执行结果:使用 LINQ 更新数据 LINQ 不仅可以从数据库中检索数据,借助于 NorthwindDataContext 上下文对象 提供的方法,我们也可以通过 LINQ 非常方便地将数据更新到数据库中。

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

1. 2.using(NorthwindDataContextcontext=newNorthwindDataContext()) {

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

在前面我们已经看到,Northwind.dbml 在生成数据库实体类的同时,也生成了 映射数据库存储过程的静态方法,通过 NorthwindDataContext 上下文对象我们 可以直接在 LINQ 中调用这些存储过程。

下面的例子展示了在 LINQ 中调用 Ten_Expensive_Products 存储过程,用于检索 Products 表中单价最贵的 10 中 商品的名称。

1. 2. 3. 4. ) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. using(NorthwindDataContextcontext=newNorthwindDataContext()) { //Usethetenmostexpensiveproductsstoredprocedure varresults=fromproductsincontext.Ten_Most_Expensive_Products(selectproducts; foreach(varproductinresults) { Console.WriteLine("Productpriceis{0}",product.UnitPrice); } //Pausetoseetheoutput Console.ReadLine(); }这个是执行结果:LINQ 检索结语 使用 LINQ 检索数据库确实可以为我们开发数据库应用程序带来许多的便利性, 例如省去编写数据库实体类和数据库访问层的代码,但这同时也会带来一些问

题! 例如在大型应用项目中这将破坏整体项目的结构,而且难以做到应用层与数 据访问层的松耦合结构, 另外就是涉及到复杂数据库事务时 LINQ 往往难以应付, 一个好的解决办法就是将事务移至数据库,在存储过程中解决事务问题,然后在 数据访问层统一调用存储过程,不过有些非常特殊的应用层需求还是会存在问 题。

从这个意义上来看,LINQ 仍然不可能全部替代传统意义上的数据库访问层, 不过在一些小型应用或快速原型开发中,使用 LINQ 确实可以给我们省去很多麻 烦。

还有一点需要说明的是,鉴于 Visual Studio 可以允许我们在 Server Explorer 中连接除 SQL 之外的其它数据库,这也就意味着我们可以通过 LINQ 访问其它类 型的数据库。

我们可以在工程中创建多个不同的 dbml 文件,用以连接不同类型 的数据库, 然后在上层使用工厂进行调用切换,就可以达到支持多数据库应用的 目的。

有关这一点,读者可以自己去尝试。

 
 

微信扫一扫 送福利