220 likes | 568 Views
第 12 章 LINQ 基 础. 第 12 章 LINQ 基 础. 本章主要内容包括: 1.1 LINQ 操作数据库原理 1.2 在项目中添加数据库映射类 1.3 LINQ 查询语法 ( 重点) 1.4 Lambda 表达式 (难点) 1.5 使用 LINQ 操作数据库 (实用). 12.1 什么是 LINQ. LINQ ( Language Integrated Query ) ,即“语言集成查询” , 架构如图. 12.2 LINQ 操作数据库原理.
E N D
第12章 LINQ 基 础 • 本章主要内容包括: • 1.1LINQ操作数据库原理 • 1.2 在项目中添加数据库映射类 • 1.3 LINQ查询语法 (重点) • 1.4 Lambda表达式 (难点) • 1.5 使用LINQ操作数据库(实用)
12.1 什么是 LINQ • LINQ(Language Integrated Query) ,即“语言集成查询”,架构如图
12.2 LINQ操作数据库原理 • LINQ to SQL 是 .NET Framework 3.5的一个组件,用于将关系数据作为对象管理。 • 由LINQ to SQL构建“LINQ to SQL对象模型”,由“LINQ to SQL运行时”负责操作数据库。 • LINQ to SQL会自动将LINQ to SQL语言转换成数据库的语言与数据库进行通信。
12.3 在项目中添加数据库映射类 • 步骤如下: (1)添加 “LINQ to SQL类” 。 (2)新建一个App_Code目录 (3)进入“对象关系设计器”(O/R设计器)。 (4)从“服务器资源管理器”中的School数据中选择数据表、存储过程到O/R设计器,创建映射到数据表的对象模型,即数据库映射类(后缀名为dbml)。 • DBML是Database Mark Language的简写,是一种基于XML的数据库标记语言。
12.4 LINQ查询语法 • LINQ支持大量的查询操作符:选择、排序、筛选数据、聚合计算等关键字 • 使用上下文类DataClassesDataContext建立实例db,以便进行各项LINQ操作,代码如下: DataClassesDataContext db = new DataClassesDataContext();
1.select • 从查询的源中检索出指定对象。例:获取Movies(电影表)所有的记录: var m = from a in db.Moviesselect a; a可以理解为数据源db.Movies的一个别名 • 注:var用来定义可枚举集合类型,对象类型是匿名的。
2.where • 筛选条件 • 例:获取所有价格大于20的Movies: var m = from a in db.Movies where a.Price > 10 select a;
多个字段查询,使用SELECT创建新对象保存查询结果多个字段查询,使用SELECT创建新对象保存查询结果 var m = from a in db.Movies where a.Price > 10 select new{a.ID, a.Title,a.Price}; select new {…} 是C#3.0匿名类型。
3.from • 定义了要查询的数据源,即给数据源定义一个别名
4.orderby • 对结果集合进行排序操作:ascending、descending。 • 例:从电影表获取全部数据,根据ReleaseDate(电影发行时间)降序排序: var m = from a in db.Movies orderby a.ReleaseDate descending select a;
5.集合运算 • Count()、Sum、Min、Max和Average • 例:获取Genre(类别)的值为“战争”的电影的数量: var mCount = (from a in db.Movies where a. Genre == ‘战争’ select a).Count();
6.Take和Skip • Take类似于SQL里的TOP,返回需要的数据记录,而Skip的作用刚好相反。 • 例:获取第6~10条间的5条电影数据: var m = db.Movies .Skip(5).Take(5); Skip(5)跳过前5条数据,Take(5)获取接下来的5条数据
7.Single和First • 都是获取数据集合中的一个元素,如果集合为空都会抛出异常。 • 它们的区别:用Single的前提是查询只会返回一条记录的集合,否则会抛出异常。First获取集合的第一个元素。
例如,获取ID的值为“2”的第一条电影: var m = (from a in db.Movies where a.ID == 2 //这里换成Single作用是一样的 select a).First(); //因为ID是主键,不可能重复 • 如果改变where的条件: var m = (from a in db.Movies where a.ID >= 2 //这样返回的数据可能不止一条 select a).First(); //如果换成Single就可能出现异常
12.5 Lambda表达式 • Lambda表达式是能返回一个方法的表达式 • 普通方法由4个部分构成:返回类型、方法名、参数列表和方法主体。 • Lambda表达式只有两部分:参数列表和方法主体,返回的是一个匿名方法,返回类型则从表达式的上下文推导得到。 • Lambda表达式的书写格式如下: (参数列表) => 表达式或者语句块 其中: • =>操作符:告诉编译器这是一个Lambda表达式。 • =>的左边:参数列表。 • =>的右边:方法主体。
例: x => x * 2 //返回参数x的两倍 x => { x * 2; } //方法的主体是一个代码块 总的来说,Lambda表达式就是为了简化匿名方法。
前一节的查询例子可以使用Lambda表达式: • 获取电影表Movies所有的记录: var m = db.Movies .Select(a => a); • 获取所有价格大于10电影: var m = db.Movies.Where(a => a.Price > 10).Select(a => a);
获取根据ReleaseDate降序排序的电影表: var m = db.Movies.OrderByDescending(a=>a. ReleaseDate); • 获取Genre的值为“战争”的电影的数量: var m = db.Movies.Count(a => a.Genre == ‘战争’); • 获取ID的值为2的第一条电影: var m = db.Movies.First(a => a.ID == 2);
12.6 使用LINQ操作数据库 • LINQ对数据库的操作是完全对类的方法的调用。 • 常见操作:查询、插入、删除、修改和调用存储过程。 首先建立LINQ to Entity上下文类的实例 MovieDBContext db = new MovieDBContext();
1、查询所有的喜剧电影 var m = from u in db. Movies where u. Genre == ‘喜剧’ select u; • 2、添加一条新的电影记录 Movie m = new Movie(); m.Title = “泰囧"; m.ReleaseDate = DateTime.Parse("2012-12-12"); m.Price = 60m; m.Genre = "喜剧"; db.Movies.Add(m); //保存插入的数据到数据库 db.SaveChanges(); //提交修改到数据库
3、删除一条记录 var movie = db.Movies.Find(id); //获取一条数据 db.Movies.Remove(movie); //删除该数据 db.SaveChanges(); //提交删除到数据库 • 4、修改一条记录 Movie m = db.Movies.Where(a => a.Title == “泰囧").First();//获取第一条数据 movie.Title = “王的盛宴"; //修改Title db. SaveChanges(); //提交修改到数据库