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

       在工程中添加Northwind.dbml文件,该文件是LINQ to SQL Classes类型的文件。      然后将Server Explorer窗口中Northwind数据库中的所有Table和Stored Procedures拖放到Northwind.dbml视图窗口中。此时,在Northwind.dbml文件中,Visual Sdutio已经自动为我们创建了数据库实体类和映射到数据库存储过程的静态方法,在后面的示例中我们可以通过LINQ语句直接使用它们。      打开Class View窗口,在其中也可以看到自动生成的实体类和静态方法。       是不是非常方便啊?那接下来就来看看如何通过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();
}

这个是执行结果:

使用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();
}

这个是执行结果:

使用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();
}

这个是执行结果:

结语

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

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

代码下载

转载于:https://www.cnblogs.com/jaxu/archive/2009/07/06/1517683.html

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

  1. SQL DBHelp.cs 操作数据库的底层类

    /// <summary> /// 操作数据库存储过程类 /// </summary> public class ExecProc { //取出数据库连接字符串 //publi ...

  2. 数据库封装 sql server mysql_mysql操作数据库进行封装实现增删改查功能

    SqlTool.class.php class SqlTool{ private $conn; private $host = "localhost"; private $user ...

  3. python 如何操作数据库 sql sqlite3 怎样操作数据库

    sqlite3模块不同于PyMySQL模块,PyMySQL是一个python与mysql的沟通管道,需要你在本地安装配置好mysql才能使用,而SQLite是python自带的数据库,不需要任何配置, ...

  4. 转载:LINQ to SQL更新数据库操作

    翻译整理ScottGu的关于LINQ to SQL的Part 4: Updating our Database .该Post讲解了如何使用LINQ to SQL更新数据库,以及如何整合业务逻辑和自定义 ...

  5. ScottGu之博客翻译-LINQ to SQL第三部分,查询数据库 (Part 3 - Querying our Database)

     本贴只为共享知识,更为简洁(即无英文的版本)将会发布在博客堂上,堂主正对此文进行审阅. 希望本贴能对您的LINQ to SQL语言的学习有一定的帮助! 原贴链接: http://weblogs.as ...

  6. 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统(Part2) 转

    LINQ to SQL LINQ to SQL 提供了访问数据库的方法,且允许我们做所有数据库相关的操作,如查询.插入.更新和删除.LINQ to SQL消除了写存储过程和从数据访问层调用的过程,它可 ...

  7. LINQ TO SQL (一):1. 对象关系设计器(O/R 设计器)

    对象关系设计器(O/R 设计器)的作用: 1. 提供了一个可视化设计图面,用于创建基于数据库中对象的 LINQ to SQL 实体类和关系:创建映射到数据库中的对象的对象模型. 2. 生成一个强类型  ...

  8. 艾伟_转载:使用LINQ to SQL更新数据库(中):几种解决方案

    在前一篇文章中,我提出了在使用LINQ to SQL进行更新操作时可能会遇到的几种问题.其实这并不是我一个人遇到的问题,当我在互联网上寻找答案时,我发现很多人都对这个话题发表过类似文章.但另我无法满足 ...

  9. 在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 1)

    在.NET 3.5 平台上使用LINQ to SQL创建三层/多层Web应用系统 (Part 1) 在新的.Net Framework 3.5平台上,Microsoft发布了LINQ(C# 3.0, ...

最新文章

  1. 在线作图|2分钟在线绘制RDA图
  2. python可以自学吗-没有编程基础,可以自学Python吗?
  3. WEB前端--HTML
  4. 前端学习(3073):vue+element今日头条管理-删除文章失败(配合axios使用)
  5. [转载]博客园MetaWeblog使用帮助
  6. PyTorch系列入门到精通——autograd与逻辑回归
  7. 通过一个月时间字段分组
  8. redis 介绍与安装
  9. cad文件管理服务器,CAD文件管理(ZT)
  10. Android方向的实习生和应届生找工作面试的建议
  11. i5 10400f和r7 2700x选哪个?
  12. python课程设计结果分析_python课程设计报告总结和体会
  13. [高通SDM450][Android9.0]CTA认证--蓝牙、WIFI申请权限
  14. win7计算机系统还原,使用Win7系统自带的系统还原功能将电脑恢复到正常状态
  15. Win11 22H2四个你不知道的隐藏功能
  16. 3650m5设置u盘启动_联想启天M415设置u盘启动步骤(支持uefi/bios双启动)
  17. Andorid中使用Gson和Fast-json解析库解析JSON数据---第三方库学习笔记(二)
  18. Anaconda3 导入外部环境报错
  19. 日历选择器html,日历选择器 - 常见 Web 特效实践
  20. 鼎信通讯一面面经(7.7 已经oc)

热门文章

  1. 【H2】绘制三角警示牌,使用turtle绘制三角警示牌,陈斌老师北京大学暑期学校Python语言基础与应用
  2. 关于styleSheets1:获取css样式
  3. [OHIF-Viewers]医疗数字阅片-医学影像-中间插播一下-es6-使用const加箭头函数声明函数相对于function声明函数有什么好处?...
  4. 备份和恢复 ESXi 主机配置
  5. npm下载swiper包报错
  6. 目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例
  7. 小程序实现图片预加载(图片延迟加载)
  8. 高分一号数据处理(一):数据下载
  9. 行人重识别综述学习笔记
  10. 用python画圣诞树的圣诞树代码