神兵利器——使用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,如需转载请自行联系原作者


相关文章
|
2月前
|
SQL 人工智能 Linux
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
297 5
SQL Server 2025 RC1 发布 - 从本地到云端的 AI 就绪企业数据库
|
1月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
139 6
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云数据库收费价格:MySQL、PostgreSQL、SQL Server和MariaDB引擎费用整理
阿里云数据库提供多种类型,包括关系型与NoSQL,主流如PolarDB、RDS MySQL/PostgreSQL、Redis等。价格低至21元/月起,支持按需付费与优惠套餐,适用于各类应用场景。
|
2月前
|
SQL Oracle 关系型数据库
Oracle数据库创建表空间和索引的SQL语法示例
以上SQL语法提供了一种标准方式去组织Oracle数据库内部结构,并且通过合理使用可以显著改善查询速度及整体性能。需要注意,在实际应用过程当中应该根据具体业务需求、系统资源状况以及预期目标去合理规划并调整参数设置以达到最佳效果。
228 8
|
3月前
|
SQL 人工智能 Java
用 LangChain4j+Ollama 打造 Text-to-SQL AI Agent,数据库想问就问
本文介绍了如何利用AI技术简化SQL查询操作,让不懂技术的用户也能轻松从数据库中获取信息。通过本地部署PostgreSQL数据库和Ollama模型,结合Java代码,实现将自然语言问题自动转换为SQL查询,并将结果以易懂的方式呈现。整个流程简单直观,适合初学者动手实践,同时也展示了AI在数据查询中的潜力与局限。
359 8
|
2月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
SQL Oracle 关系型数据库
本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
本机不安装Oracle客户端,使用PL/SQL Developer连接远程数据库
669 0
|
4月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
395 0
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
741 3

热门文章

最新文章