使用LINQ to SQL (第一部分)

2009-05-12 14:33:21|  分类: 默认分类 |  标签: |字号大中小 订阅

什么是LINQ to SQL?

LINQ to SQL 是随.NET Framework Orcas版一起发布的O/RM(对象关系映射)实现,它允许你用.NET 的类来对一个关系型数据库建模。然后你可以用LINQ对数据库进行查询,以及进行更新/插入/删除数据的操作。

LINQ to SQL完全支持事务,视图和存储过程。它还提供了一种把数据验证和业务逻辑规则结合进你的数据模型的便利方式。

使用LINQ to SQL对数据库建模:

Visual Studio Orcas版中提供了一个LINQ to SQL设计器,该设计器提供了一种简易的方式,将数据库可视化地转换为LINQ to SQL对象模型。我下一篇博客将会更深入一些来介绍怎么使用该设计器(你可以观看我一月份时录制的这个关于如何从头开始创建LINQ to SQL模型的录像)。

通过LINQ to SQL设计器,我可以方便地设计出如下所示的Northwind数据库的示例模型:

上图定义了四个实体类:Product, Category, Order 和 OrderDetail。每个类的属性都映射到数据库中相应表的字段,类实体的每个实例代表了数据表中的一行记录。

在上图中,四个实体类间的箭头代表了不同实体间的关联/关系。它们主要是根据数据库中的主键/外键关系生成的。设计器上的箭头的指向表明了该关系是一对一还是一对多的关系。基于此,强类型的属性将会被加入到实体类中。例如,上边的Category类和Product类之间有一个“一对多”的关系。这意味着Category类将有一个"Products"属性,该属性代表了在该类中所有的产品对象的集合。而Product类将会有一个"Category"属性来指向一个Category类的实例,该Category类的实例表明了了产品所属的类别。

上图中LINQ to SQL设计器的右侧列出了与我们的数据库模型交互的存储过程。在上边的例子中,我添加了一个“GetProductsByCategory”存储过程。它有一个categoryID作为输入参数,返回一个产品实体序列作为结果集。下面的代码将展示如何调用该存储过程。

理解DataContext类

当你点击LINQ to SQL设计器上的“保存"按钮时,Visual Studio将会保存我们建立的代表了实体和数据库关系的各个类。针对加入到我们的解决方案的每一个LINQ to SQL设计器文件,同时也会生成一个自定义的DataContext类。这个DataContext类是我们从数据库中查询实体或者进行更改操作的主要渠道。生成的DataContext类将含有一些属性,对应于我们在数据库中建了模的每个数据表,以及一些方法,对应于我们添加的每个存储过程。

例如,下图就是基于我们上边设计的模型而生成的的NorthwindDataContext类:

LINQ to SQL 代码例子

用LINQ to SQL 设计器对我们的数据库建模之后,我们就可以很方便地编写代码对数据库进行操作了。下边是一些展示了常见的数据库操作的代码例子:

1) 从数据库中查询Products

下面的代码用LINQ to SQL 查询语法来获取Product对象的IEnumerable序列。注意代码是如何通过Product/Category关系来仅查出那些类别是"Beverages"的产品的:

C#:

VB:

2) 更新数据库中的一条产品记录

下面的代码示范了如何从数据库中查询出单一的一条产品记录,更新它的价格,然后将改动保存至数据库:

C#:

VB:

注意:VB在Orcas Beta1中尚不支持Lambda。但是在Beta2中,它就会支持了--那时代码就会能写得更为简洁一些。

3) 向数据库中插入一条新的Category和两条新的Products

下面的代码示范了如何生成一个新的分类,然后生成两条和该分类相关联的产品,然后将这三条记录保存到数据库中。

注意下边,我不用手工去维护主/外键关系,取而代之的是,我只向分类对象的“Products”集合中添加了两个Product记录,然后把该Category对象添加到DataContext的“Categories”集合中,LINQ to SQL将知道自动为我持久适当的PK/FK的关系。

C#

VB:

4) 从数据库中删除Products

下面的代码示范了如何从数据库中删除所有的玩具产品:

C#:

VB:

5) 调用存储过程

下面的代码示范了如何不使用LINQ查询语法,而是通过调用我们在上面向数据模型中添加的“GetProductsByCategory”存储过程来查询Product实体。注意,一旦我查询出了Product结果集,我可以更新/删除它们,然后再调用 db.SubmitChanges()来将这些更新提交到数据库。

C#:

VB:

6) 在服务器端分页查询Products

下面的代码示范了如何通过LINQ查询语法实现高效的服务器端数据库分页查询。通过使用下面的Skip()和Take()操作符,我们从数据库中只查询出从200行开始的10条记录:

C#:

VB:

总结

LINQ to SQL提供了一种很棒的、干净利索的方法来为你的应用程序来建立数据层。一旦你定义了数据模型,你就可以方便而且有效地对它进行查询,插入,更新和删除。

转载于:https://www.cnblogs.com/shixudong/archive/2013/01/22/2870910.html

Linq To Sql 练习相关推荐

  1. 如何查看Linq to SQL运行时,实际执行的Sql语句

    调试Linq to sql代码是, 如果遇到错误,很难判断错误的原因是什么,如果能够输出实际执行的sql原文,对于我们寻找错误的原因有有很大帮助. 以下是我用到的方法: StringBuilder s ...

  2. Linq to SQL 资源

    Scott Guthrie 的 Linq to SQL 系列: 1)介绍 http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to ...

  3. .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理

    步步为营VS 2008 + .NET 3.5(12) - DLINQ(LINQ to SQL)之事务处理和并发处理 作者:webabcd 介绍 以Northwind为示例数据库,DLINQ(LINQ ...

  4. 一步一步学Linq to sql(六):探究特性

      延迟执行 IQueryable query = from c in ctx.Customers select c; 这样的查询句法不会导致语句立即执行,它仅仅是一个描述,对应一个SQL.仅仅在需要 ...

  5. LINQ to SQL 在 Visual Studio 2008 中的简单应用

    在.Net Framework 3.5 中,最激动人心的就是增加了LINQ功能,LINQ在数据集成的基础上提供了新的轻型方式.有了LINQ,我们创建的查询现在就编程了.Net 框架的一个成员,在对要操 ...

  6. 一步一步学Linq to sql(一):预备知识

    从今天起将推出新手讲堂,首先从linq开始详细讲解.一步一步学Linq to sql(一):预备知识 什么是Linq to sql Linq to sql(或者叫DLINQ)是LINQ(.NET语言集 ...

  7. 一步一步学linq to sql(四)查询句法

    select 描述:查询顾客的公司名.地址信息 查询句法: var 构建匿名类型1 = from c in ctx.Customers select new { 公司名 = c.CompanyName ...

  8. 在.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, ...

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

    设计开发表现层 表现层负责应用程序的用户界面,图4.1是表现层的详细视图,包括Web Forms, Web User Control, Code-Behind 和共享的用户界面代码.表现层负责推送信息 ...

  10. LINQ : 如何为LINQ TO SQL实现自定义业务逻辑

    LINQ TO SQL很好很强大,它几乎包含了我们能够想到的所有与数据库有关的操作,甚至也包含了一些我们可能都没有想到的. 但不管怎样,也许我们需要在LINQ TO SQL的操作中添加一个自定义业务逻 ...

最新文章

  1. python yaml用法详解
  2. 异常以及异常处理框架探析
  3. 管理不再是交换,而是相互成全!做到这三点,管理更有成效!
  4. JS模块化工具requirejs教程
  5. java阿里云短信服务开通验证码功能实现(1)
  6. 从0开始架构一个IOS程序—— 05— NavigationBar 搭建首页面
  7. vue 一个组件内多个弹窗_使用vue实现各类弹出框组件
  8. ORA-04031:unable to allocate 4120 bytes of shared memory ‘obj stat mem’故障解决
  9. 蚂蚁链发布BTN,有什么用?
  10. 嵌入式单片机该如何选型?
  11. storm任务提交流程
  12. 企业为什么要建立档案管理?具体如何实现?
  13. leetcode 2203 单源最短路中转
  14. [校园网]绕过校园网使用自己服务器流量教程
  15. python多个箱线图_箱线图Python
  16. Portapack应用开发教程(七)nrf24l01解调
  17. Java学习星球,Java学习路线
  18. 圆锥的表面积和体积计算
  19. 如何在enable了database vault的数据库里运行datapump
  20. “房山的房子会升值”--摘自《北京晚报》

热门文章

  1. 湘西州计算机等级考试内容,2020年3月湖南省湘西州市计算机等级考试注意事项...
  2. python windows和linux路径_python复制文件,路径不存在问题(Windows和linux路径分隔符不统一)...
  3. python元胞自动机模拟交通_大师兄带你复现 -gt; 难度超高的二维CA元胞自动机模型...
  4. jquery清空div内容_jQuery常用功能
  5. 如何把很多照片拼成一张照片_把很多小照片拼成一张大照片是怎么做的
  6. unity 脚本中 调用另一个脚本_Unity 2019.4 脚本生命周期
  7. linux raid和mdadm,linux的raid和mdadm
  8. 根据控件句柄读控件在内存的数据_WPF 2020界面开发新纪元——Accordion控件、图表功能升级...
  9. cmake 编译curl源码_OpenCV4.0 源码编译
  10. 20211217 为什么正定矩阵的主子式都是正的?(注意是主子式,不止是顺序主子式)