在前面学习了C#3.0新语特性和改进,这些新特性在我们编写程序时为我们提供了非常大的帮助。从现在开始正式学习LINQ。
    LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。
    LINQ定义了一组标准查询操作符用于在所有基于.NET平台的编程语言中更加直接地声明跨越、过滤和投射操作的统一方式,标准查询操作符允许查询作用于所有基于IEnumerable<T>接口的源,并且它还允许适合于目标域或技术的第三方特定域操作符来扩大标准查询操作符集,更重要的是,第三方操作符可以用它们自己的提供附加服务的实现来自由地替换标准查询操作符,根据LINQ模式的习俗,这些查询喜欢采用与标准查询操作符相同的语言集成和工具支持。
    LINQ包括五个部分:LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML。
    LINQ to SQL全称基于关系数据的.NET语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能。其建立于公共语言类型系统中的基于SQL的模式定义的集成之上,当保持关系型模型表达能力和对底层存储的直接查询评测的性能时,这个集成在关系型数据之上提供强类型。
    LINQ to XML在System.Xml.LINQ命名空间下实现对XML的操作。采用高效、易用、内存中的XML工具在宿主编程语言中提供XPath/XQuery功能等。
    DataContext与实体
    DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型。DataContext作为LINQ to SQL框架的主入口点,为我们提供了一些方法和属性,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。DataContext提供了以下一些使用的功能:创建和删除数据库,数据库验证以及数据库更改;以日志形式记录DataContext生成的SQL;执行SQL(包括查询和更新语句)。
    创建和删除数据库,数据库验证以及数据库更改:
    DataContext是实体和数据库之间的桥梁,那么首先我们需要定义映射到数据表的实体:

CityEntity
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq.Mapping;


namespace CityDataContext
{
    [Table(Name = "DB_City")]
    public class CityEntity
    {
        [Column(IsPrimaryKey = true, Name = "CityID")]
        public int CityID { get; set; }
        
        [Column(Name="Pid")]
        public int Pid{get;set;}

        [Column(Name="CityName")]
        public string CityName{get;set;}

        [Column(Name = "IsVisible")]
        public bool IsVisible{get;set;}

        [Column(Name = "IsLastNode")]
        public bool IsLastNode{get;set;}

        [Column(Name = "Order")]
        public int Order{get;set;}

        [Column(Name = "MetaID")]
        public int MetaID{get;set;}

        [Column(Name = "CityType")]
        public int CityType{get;set;}

        [Column(Name = "ListName")]
        public string ListName{get;set;}
    }
}

接着我们新建一个继承DataContext的类,CreateDB类用于创建数据库,该数据库有一个表DB_City:

CreateDB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;

namespace CityDataContext
{
    public class CreateDB:DataContext
    {
        public Table<CityEntity> Citys;

        public CreateDB(string connection)
            : base(connection)
        {
        }

        public CreateDB(System.Data.IDbConnection connection)
            : base(connection)
        { }

    }
}

接下来我们先创建一个数据库TestDB,在调用CreateDatabase后,新的数据库就会存在并且会接受一般的查询和命令。接着插入一条记录并且查询。最后删除这个数据库,具体代码如下:

            string connStr = "server=TECH_CHANGZHU;database=TestDB;uid=sa;pwd=123456";
            CreateDB newDB = new CreateDB(connStr);
            //创建数据库
            newDB.CreateDatabase();

            //添加记录
            var newRow = new CityEntity
            {
                CityID = 1,
                CityName = "北京",
                CityType = 1,
                IsLastNode = false,
                IsVisible = true,
                ListName = "bj",
                MetaID = 0,
                Order = 0,
                Pid = 0
            };



            newDB.Citys.InsertOnSubmit(newRow);
            newDB.SubmitChanges();

            var CityList = from CityOne in newDB.Citys
                           select CityOne;

            //删除数据库
            newDB.DeleteDatabase();

CreateDatabase方法用于在服务器上创建数据库。创建时数据库的名称有以下方法来定义:如果数据库在连接字符串中标识,则使用该连接字符串的名称;如果存在DatabaseAttribute属性(Attribute),则将其Name属性(Property)用作数据库的名称;如果连接字符串中没有数据库标记,并且使用强类型的DataContext,则会检查与DataContext继承类名称相同的数据库。如果使用弱类型的DataContext,则会引发异常; 如果已通过使用文件名创建了DataContext,则会创建与该文件名相对应的数据库。
    DataContext是实体和数据库之间的桥梁,那么我们首先用实体类描述关系数据库表和列的结构的属性。再调用DataContext的CreateDatabase方法,LINQ to SQL会用我们的定义的实体类结构来构造一个新的数据库实例。还可以通过使用 .mdf 文件或只使用目录名(取决于连接字符串),将 CreateDatabase与SQL Server一起使用。LINQ to SQL使用连接字符串来定义要创建的数据库和作为数据库创建位置的服务器。
    DeleteDatabase方法用于删除由DataContext连接字符串标识的数据库。
    数据库验证:DatabaseExists方法用于尝试通过使用DataContext中的连接打开数据库,如果成功返回true。代码如下:

Code
            //检测TestDB数据库是否存在
            if (newDB.DatabaseExists())
            {
                Response.Write("数据库存在");
            }
            else
            {
                Response.Write("数据库不存在");
            }

下面再来看数据库修改:
    SubmitChanges方法计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改。无论对象做了多少项更改,都只是在更改内存中的副本。并未对数据库中的实际数据做任何更改。直到对DataContext显式调用SubmitChanges,所做的更改才会传输到服务器。调用时,DataContext会设法将我们所做的更改转换为等效的SQL命令。我们也可以使用自己的自定义逻辑来重写这些操作,但提交顺序是由DataContext的一项称作“更改处理器”的服务来协调的。事件的顺序如下:    
    1.当调用SubmitChanges时,LINQ to SQL会检查已知对象的集合以确定新实例是否已附加到它们。如果已附加,这些新实例将添加到被跟踪对象的集合;2.所有具有挂起更改的对象将按照它们之间的依赖关系排序成一个对象序列。如果一个对象的更改依赖于其他对象,则这个对象将排在其依赖项之后;3.在即将传输任何实际更改时,LINQ to SQL会启动一个事务来封装由各条命令组成的系列;4.对对象的更改会逐个转换为SQL命令,然后发送到服务器。 
    如果数据库检测到任何错误,都会造成提交进程停止并引发异常。将回滚对数据库的所有更改,就像未进行过提交一样。DataContext 仍具有所有更改的完整记录。下面代码说明的是在数据库中查询ListName为bj的城市,然后修改其ListName,更新并调用SubmitChanges()方法。接着修改其CityName,更新了数据但并未调用SubmitChanges()方法。

            //查询
            CityEntity City = newDB.Citys.First(c => c.ListName == "bj");
            //更新数据并调用SubmitChanges()方法
            City.ListName = "beijing";
            newDB.SubmitChanges();
            //更新数据没有调用SubmitChanges()方法
            City.CityName = "北京市";

linq学习笔记(2):DataContext相关推荐

  1. Linq 学习笔记(二)

    Linq 学习笔记(二) 下面就来介绍一些查询的示例: 1.Linq查询 var racers = from r in Formula1.GetChampions() where r.Wins > ...

  2. 一起谈.NET技术,Linq学习笔记

    写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...

  3. C# LINQ学习笔记四:LINQ to OBJECT之操作文件目录

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5816051.html,记录一下学习过程以备后续查用. 许多文件系统操作实质上是查询,因此非常适合使用LINQ方 ...

  4. LINQ学习笔记之四:查询内存对象

    附上WORD文档,从这里下载. 查询内存对象 这一章中主要介绍了使用LINQ查询内存对象的一些基本语法.在下一章将会有更高级的用法介绍.本章中的示例数据是一个简单的出版社信息.这里是数据文件.下面的图 ...

  5. Linq学习笔记(三)

    下面的代码演示了如何利用Linq结合AspNetPager控件实现分页功能,以及如果利用Linq to Xml将当前页数据保存为Xml  using (NorthWindDataContext db  ...

  6. LINQ学习笔记(9) LINQ to Objects---查询内存中对象的集合

    从这一篇开始要总结的是LINQ在实际中的应用,首先要总结的是LINQ to Objects,也就是LINQ与程序对象的配合使用. 其中程序对象集合最典型就是与数组的配合使用,如下示例: 1 class ...

  7. [导入]Linq学习笔记(2.2)——深入DLinq查询

    摘要: 深入学习Dlinq对关系型数据库映射对象的查询操作  阅读全文 Young.J 2007-06-10 18:35 发表评论 [小组]  [博问]  [闪存] 文章来源:http://www.c ...

  8. linq学习笔记(1):c#3.0新特性(2)

        4.       Object and Collection Initializers(对象和集合初始器)    Object Initializer(对象初始器),顾名思义就是一种初始化对象 ...

  9. linq学习笔记(5):Count/Sum/Min/Max/Avg

    Count/Sum/Min/Max/Avg用于统计数据,比如统计一些数据的个数,求和,最小值,最大值,平均数. 1.Count:返回集合中的元素个数,返回INT类型:不延迟.生成SQL语句为:SELE ...

最新文章

  1. C++中关键字volatile和mutable用法
  2. 刚刚!美国官宣100000名 IT 人失业,感觉很慌 !
  3. 今年期末微积分考试试题:看看你能够在两个小时内做对几道题?
  4. 离开网易的转型之路1:选择测试之路-路上的迷茫
  5. 【GDKOI2003】分球
  6. React个Vue的对比
  7. mysql - Docker Wordpress连接到本地主机上的数据库服务器
  8. 新疆微软.NET技术俱乐部7月活动图文报道
  9. python获取图片大小_如何在pygame(python)中获取图片大小
  10. JAVA基础系列:内部类获取外部类的成员变量
  11. 【Mark工具】一些好用的图片标注工具
  12. linux kettle运行作业,kettle之linux使用kettle
  13. 3Dmax哪个版本最好用?3dmax哪个版本稳定一点?
  14. OkHttp系列——使用教程
  15. qq显示下线通知什么意思_qq最近登录设备显示其他设备,但我手机没有下线通知,怎么回事...
  16. Hive 的数据怎么导入导出?
  17. filter 过滤器
  18. 申请美国计算机科学博士,美国计算机博士申请案例分析
  19. UVa-1583 生成元
  20. react中使用水印water-mark-oc

热门文章

  1. linux ubuntu R 无法安装rggobi包的原因及解决方案
  2. IOS开发基础知识--碎片34
  3. dirname(__FILE__) 的使用总结
  4. python可分组字典
  5. ubuntu上建立mini2440 qt编译环境
  6. WPF 分批加载十万个按钮
  7. 苹果CEO乔布斯如何工作
  8. .NET Framework 3.5 中的功能简介(1)
  9. Git入门最终集!SSH公钥是乱码怎么办?IDEA与Git!将自己的代码上传至远程仓库!
  10. python训练数据集_Python——sklearn提供的自带的数据集