神兵利器——使用LINQ to SQL检索和操作数据库

简介:

自.NET 3.0开始,LINQ(Language Integrated Query,整合查询语言)便逐渐出现在.NET开发的各个角落,它不仅提供了一种用于快速检索结构化标记语言(如XML)的方法,而且还非常有效地被用来处理与数据库的交互。如今,通过LINQ to SQL和LINQ to Entities,LINQ已经被扩展到用来进行数据库访问,用以消除从数据访问层到数据源层出不穷的区别。LINQ to SQL和SQL之间存在一个直接映射关系,它可以通过我们事先指定的数据库连接自动生成数据库实体类,而我们只需要通过LINQ语句操作这些实体对象就可以非常轻松地从数据库中获取到数据。当然,LINQ to SQL所生成的实体对象的功能远远不止这些,它甚至支持数据的更新和存储过程的调用,所有这些都可以通过简单的几行LINQ语句来完成,让我们真正摆脱了编写数据访问层、数据库实体类的工作。

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

LINQ to SQL对象模型

      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数据库。

7-6-2009 2-58-48 PM       在工程中添加Northwind.dbml文件,该文件是LINQ to SQL Classes类型的文件。7-6-2009 3-01-14 PM      然后将Server Explorer窗口中Northwind数据库中的所有Table和Stored Procedures拖放到Northwind.dbml视图窗口中。此时,在Northwind.dbml文件中,Visual Sdutio已经自动为我们创建了数据库实体类和映射到数据库存储过程的静态方法,在后面的示例中我们可以通过LINQ语句直接使用它们。7-6-2009 3-04-24 PM      打开Class View窗口,在其中也可以看到自动生成的实体类和静态方法。7-6-2009 3-07-59 PM       是不是非常方便啊?那接下来就来看看如何通过LINQ检索和修改数据。

使用LINQ to SQL检索数据

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

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

复制代码
using  (NorthwindDataContext context  =   new  NorthwindDataContext()) 

    var results 
=  from curstomers  in  context.Customers 
                  
where  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(); 
}
复制代码

这个是执行结果:

7-6-2009 3-58-22 PM

使用LINQ to SQL更新数据

      LINQ to SQL不仅可以从数据库中检索数据,借助于NorthwindDataContext上下文对象提供的方法,我们也可以通过LINQ to SQL非常方便地将数据更新到数据库中。下面的例子展示了将数据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 
=   " Drama Cafe " ,
        CustomerID 
=   " DRACA " ,
        ContactName 
=   " Tom Smith " ,
        City 
=   " Beverly Hills " ,
        Address 
=   " 123 Melrose Place " ,
        PostalCode 
=   " 90210 "
    };
    context.Customers.InsertOnSubmit(customer);
    context.SubmitChanges();
    Console.WriteLine(
" Number of DRACA records: {0} " , context.Customers.Where(c  =>  c.CustomerID  ==   " DRACA " ).Count());

    
//  Modify the record and verify it is changed through Count
    customer.ContactName  =   " Joe Smith " ;
    context.SubmitChanges();
    Console.WriteLine(
" Number of Joe Smith records: {0} " , context.Customers.Where(c  =>  c.ContactName  ==   " Joe Smith " ).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();
}
复制代码

这个是执行结果:

7-6-2009 3-09-41 PM

使用LINQ to SQL执行存储过程

      在前面我们已经看到,Northwind.dbml在生成数据库实体类的同时,也生成了映射数据库存储过程的静态方法,通过NorthwindDataContext上下文对象我们可以直接在LINQ to SQL中调用这些存储过程。下面的例子展示了在LINQ to SQL中调用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 price is {0} " , product.UnitPrice);
    }

    
//  Pause to see the output
    Console.ReadLine();
}
复制代码

这个是执行结果:

7-6-2009 3-10-05 PM

结语

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

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

代码下载


本文转自Jaxu博客园博客,原文链接:http://www.cnblogs.com/jaxu/archive/2009/07/06/1517683.html,如需转载请自行联系原作者


相关文章
|
12天前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
68 9
|
30天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
99 6
|
2月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
98 11
|
2月前
|
SQL 监控 安全
SQL Servers审核提高数据库安全性
SQL Server审核是一种追踪和审查SQL Server上所有活动的机制,旨在检测潜在威胁和漏洞,监控服务器设置的更改。审核日志记录安全问题和数据泄露的详细信息,帮助管理员追踪数据库中的特定活动,确保数据安全和合规性。SQL Server审核分为服务器级和数据库级,涵盖登录、配置变更和数据操作等事件。审核工具如EventLog Analyzer提供实时监控和即时告警,帮助快速响应安全事件。
|
2月前
|
SQL 数据挖掘 数据库
SQL自学笔记(2):如何用SQL做简单的检索
本文深入介绍了SQL的基本语法,包括数据查询、过滤、排序、分组及表连接等操作,并通过实际案例展示了SQL在用户研究中的应用,如用户行为分析、用户细分、用户留存分析及满意度调查数据分析。
51 0
SQL自学笔记(2):如何用SQL做简单的检索
|
2月前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
4月前
|
SQL 存储 监控
串口调试助手连接SQL数据库的技巧与方法
串口调试助手是电子工程师和软件开发人员常用的工具,它能够帮助用户进行串口通信的调试和数据分析
|
4月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
384 3
|
4月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:实现过程与关键细节解析an3.021-6232.com
随着互联网技术的快速发展,ASP.NET作为一种广泛使用的服务器端开发技术,其与数据库的交互操作成为了应用开发中的重要环节。本文将详细介绍在ASP.NET中如何连接SQL数据库,包括连接的基本概念、实现步骤、关键代码示例以及常见问题的解决方案。由于篇幅限制,本文不能保证达到完整的2000字,但会确保
|
4月前
|
SQL 开发框架 .NET
ASP连接SQL数据库:从基础到实践
随着互联网技术的快速发展,数据库与应用程序之间的连接成为了软件开发中的一项关键技术。ASP(ActiveServerPages)是一种在服务器端执行的脚本环境,它能够生成动态的网页内容。而SQL数据库则是一种关系型数据库管理系统,广泛应用于各类网站和应用程序的数据存储和管理。本文将详细介绍如何使用A
125 3

热门文章

最新文章