收藏 分享(赏)

Visual C# 2008程序设计教程14.ppt

上传人:weiwoduzun 文档编号:5005806 上传时间:2019-01-29 格式:PPT 页数:32 大小:361KB
下载 相关 举报
Visual C# 2008程序设计教程14.ppt_第1页
第1页 / 共32页
Visual C# 2008程序设计教程14.ppt_第2页
第2页 / 共32页
Visual C# 2008程序设计教程14.ppt_第3页
第3页 / 共32页
Visual C# 2008程序设计教程14.ppt_第4页
第4页 / 共32页
Visual C# 2008程序设计教程14.ppt_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、1,第14章 语言集成查询LINQ 本章要点:LINQ实现的基础 LINQ概述 LINQ 和泛型LINQ查询步骤 LINQ查询语句 LINQ和数据库操作,2,14.1 LINQ实现的基础,.NET Frameword3.5中,新增加了一种数据类型var,var被称为隐式类型,该关键字指示编译器根据初始化语句右侧的表达式推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型、.NET Framework类库中定义的类型或任何表达式。var i = 5; /定义了变量i被当做一个整数var s = “Hello”; /定义的变量s被当做字符串 var a = new 0, 1, 2 ;/定

2、义了一个变量a,为数组变量 /定义了一个匿名类型的变量 var anon = new Name = “Terry”, Age = 34;var list = new List();/定义了一个List类型的变量,14.1.1 隐式类型变量,3,14.1 LINQ实现的基础,var关键字可以用在下列场合: 1 在定义局部变量中使用 2 在初始化for循环中计数器的起始值时使用 3. 在初始化foreach语句中的接收器对象中使用 4. 在using语句中使用 使用var隐式类型的变量声明时需要遵守一些基本规则 1. 只有在同一语句中声明和初始化局部变量时才能使用var 2. 不能将该变量初始化为

3、null 3. 不能将var用于类的字段 4. 由var声明的变量不能用在初始化表达式中 5. 不能在同一语句中初始化多个隐式类型的变量,14.1.1 隐式类型变量,4,14.1 LINQ实现的基础,匿名类型是从对象初始化器自动推断和生成的元组类型。可以在不声明一个类型的情况下而直接声明一个对象,因为只要利用初始化器指明的对象属性就可以来推断这个对象的类型。匿名类型只要使用没有类型名字的new表达式,并通过对象初始化器进行初始化即可。 var p = new X = 1,Y = 2 以上代码中并不存在对象p的这样一种类型,但却直接声明了该对象,并通过初始化器X = 1,Y = 2对该对象进行初

4、始化,这就是匿名类型。,14.1.2 匿名类型,5,14.1 LINQ实现的基础,var b1 = new Name = “The First Sample Book“, Price = 88.0f ;var b2 = new Price = 25.0f, Name = “The Second Sample Book“ ;var b3 = new Name = “The Third Sample Book“, Price = 35.00f ;Console.WriteLine(b1.GetType();Console.WriteLine(b2.GetType();Console.WriteLi

5、ne(b3.GetType();前面三行声明并初始化了三个具有匿名类型的对象,它们都将具有公共可读写属性Name和Price。我们可以看到,匿名类型的属性连类型都省掉了,完全是由编译器根据相应属性的初始化表达式推断出来的。,6,14.1 LINQ实现的基础,Lambda表达式是一种简洁的内联(in-line)函数,它提供了一个非常紧凑而且类型安全的方式来编写函数,该函数可以当做参数来传递并在以后进行运算。这种简洁的特性在编写LINQ查询表达式时极其有用。一个Lambda表达式的语法: 参数列表 “=”符号 调用时要运算的表达式或语句块params = expression其中params是参数

6、列表,expression为表达式或语句块。,14.1.3 Lambda表达式,7,14.1 LINQ实现的基础,利用委托方法来搜索字符串数组中包含字符b的字符串数组 string list = new string “abc”,”abed”,”hebe”;string list1 = Array.FindAll(list,delegate(string s) /使用委托方法return s.IndexOf(“b”) = 0;);使用Lambda表达式的实现代码 string list = new string “abc”,”abed”,”hebe”;string list1 = Array.

7、FindAll(list,s = (s.IndexOf(“b”) = 0);使用Lambda表达式可以简化委托方法的编写,而且不像委托方法那样要求参数类型必须是明确指明,8,14.1 LINQ实现的基础,在LINQ中,CLR会自动把Lambda表达式过滤语句翻译成标准的SQL语句来操作数据库 NorthwindDataContext db = new NorthwindDataContext()ILnumerable staffs = db.Staffs.Where(s = s.Salary = 10000)以上代码实现从数据表Staffs从获得Salary为10000及其以上的员工信息,实际

8、上就等于“select * from Staffs where Salary = 10000”的SQL查询语句。Lambda表达式使得委托方法的实现变得更加方便,而且能够与LINQ更好的结合。,9,14.2 LINQ概述,LINQ是Language Integrated Qyery的缩写,中文名字是语言集成查询,最初在Visual Studio 2008中发布,它提供给开发人员一个统一的编程概念和语法,开发人员不需要关心将要访问的是关系数据库还是XML数据,或是远程的对象,它都采用同样的访问方式。LINQ是一组系列技术,包括LINQ、DLINQ、XLINQ等。其中LINQ到对象是对内存进行操作

9、,LINQ到SQL是对数据库的操作,LINQ到XML是对XML数据进行操作。下页图描述了LINQ技术的体系结构。,10,14.2 LINQ概述,在Visual Studio 2008中,可以使用C#语言为各种数据源编写LINQ查询:包括SQL Server数据库、XML文档、ADO.NET数据集以及支持IEnumerable接口(包括泛型)的任意对象集合。除了这几种常见的数据源之外,.NET Framework3.5还为用户扩展LINQ提供支持,11,14.4 LINQ和泛型,LINQ查询基于泛型类型,而泛型这一新的数据类型从.NET Framework 2.0版开始引入的。使用时并不需要深入

10、了解泛型的具体内容,就可以直接开始编写查询语句。LINQ查询变量类型化为IEnumerable或派生类型(如IQueryable接口)时,意味着在执行该查询时,该查询将生成包含零个或多个T对象的序列。为了避免使用泛型语法,可以使用隐式类型来声明查询,即使用var关键字来声明查询。var关键字指示编译器通过查看在from子句中指定的数据来推断查询变量的类型,12,14.3 LINQ查询步骤,LINQ的查询操作通常由以下三个步骤组成:(1) 获得数据源。(2) 创建查询。(3) 执行查询。string word = “One”,“Two”, “Three”, “Four”, “Five”,“Six

11、”;var result =from s in word /从word数组中查询字符串where s.Length = 3 /条件是字符串长度是3select s; /返回查询结果foreach (var s in result) /输出结果Response.Write(s);上面的代码中,word数组是数据源,第二句代码则创建了查询,第三句代码则执行了查询。,13,14.5 LINQ查询语句,LINQ最明显的“语言集成”部分是查询表达式。查询表达式使用C# 3.0中引入的声明性查询语法编写。通过使用查询语法,开发人员可以使用最少的代码对数据源执行复杂的筛选、排序和分组操作。 查询表达式是由查

12、询关键字和对应的操作数组成的表达式整体,其中,查询关键字是常用的查询运算符。C#为这些运算符提供对应的关键字,从而能更好的与LINQ集成。查询表达式必须以from为关键字的子句开头,并且必须以select或group关键字的子句结尾。在第一个from子句和最后一个select或group子句之间,查询表达式可以包含一个或多个由下列关键字组成的可选子句:where、orderby、join、let,甚至可以包括附加的from子句。同时还可以使用into关键字使join或group子句的结果能够作为同一查询表达式中附加查询子句的数据源。,14,14.5 LINQ查询语句,14.5.1 from子句

13、 查询表达式必须以from子句开头,它同时指定了数据源和范围变量。单个的from子句 LINQ查询表达式中只包含一个from子句。一般情况下,单个from子句查询往往使用一个数据源。 多个from子句 在LINQ查询表达式中包含多个from子句。一般情况下,包含多个from子句的查询往往使用多个数据源。 复合from子句 在一些情况下,数据源的元素也是一个数据源(子数据源)。如果要查询子数据源中的元素,则需要使用复合from子句。,15,14.5.2 select子句使用select子句可以查询所有类型的数据源。它可以指定查询结果的类型和表现形式。简单的select子句只能查询与数据源中所包含

14、的元素具有相同类型的对象。一个LINQ表达式可以不包含select子句,也可以包含一个select子句。14.5.3 group 子句 使用group子句可以对查询的结果进行分组,并返回元素类型为IGrouping的对象序列。其中Key参数指定元素的键的类型,可以采用任何数据类型,TElement参数指定元素值的类型。,14.5 LINQ查询语句,16,14.5.4 where子句where子句是通过条件的设定对查询的结果进行过滤,筛选元素满足的逻辑条件,从数据源中排除指定的元素。where子句一般由逻辑运算符组成。一个查询表达式可以包含1个或多个where子句,甚至不包含where子句。每个

15、where子句可以包含一个或多个布尔条件表达式。 14.5.5 orderby子句 使用orderby子句可以很方便地对返回的查询数据按照关键字(或键)进行排序。其中,排序方式可以为“升序”或“降序”,排序的关键字(或键)可以为一个或多个。 。,14.5 LINQ查询语句,17,14.5.6 join子句 join子句可以将来自不同数据源中没有直接关系的元素进行关联,但是要求二个不同数据源中必须有一个相等元素的值。join子句可以为数据源之间建立以下3种联接关系。(1)内部联接:二个数据源必须都存在相同的值,即二个数据源都必须存在满足联接关系的元素。(2)分组联接,即为含有into子句和joi

16、n子句。(3)左外部联接,和SQL语句中的“INNER LEFT子句”比较相似。14.5.7 into子句 into子句可以创建一个临时标识符,使用该标识符可以存储group、join或select子句查询结果。,14.5 LINQ查询语句,18,14.5.8 let子句 let子句可以创建一个范围变量,使用该变量可以保存表达式中的中间结果。 using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1class Program/定义学生类,并定义三个类属性。

17、public class Student public string name get; set; public int age get; set; public string address get; set; ,14.5 LINQ查询语句,19,static void Main(string args)/初始化一个List类型的学生类集合,其中定义了六个学生对象。List stud = new List new Student name =“Mary“,age =21,address =“北京“,new Student name =“John“,age =37,address =“北京“,

18、new Student name =“Make“,age =40,address =“北京“,new Student name =“Rose“,age =50,address =“北京“,new Student name =“Peter“,age =38,address =“上海“, new Student name =“Hanson“,age =30,address =“上海“ ;,14.5 LINQ查询语句,20,/定义LINQ查询表达式var studentQuery =from s in stud /定义范围变量和获得数据源where s.address =“北京“ /定义查询条件/查

19、询的排序方式是按照年龄大小降序排列orderby s.age descending select s .name ;Console.WriteLine(“地址在北京的学生有:“);foreach (var a in studentQuery) /循环遍历符合要求的变量Console.WriteLine(a); /输出符合要求的学生的名字,14.5 LINQ查询语句,21,14.6.1 LINQ到SQL基础 LINQ 到 SQL是LINQ操作数据库中最重要的技术。它提供运行时的基础结构,将关系数据库作为对象进行管理。在LINQ到SQL中,关系数据库的数据模型映射到开发人员所使用的编程语言表示的对

20、象模型。当应用程序运行时,LINQ到SQL会将对象模型中的语言集成查询转换为SQL,然后将它们发送到数据库进行执行。当数据库返回结果时,LINQ到SQL会将它们转换回开发者可以使用的编程语言处理对象。 通过使用LINQ到SQL,可以像访问内存中的集合一样访问SQL Server数据库;可以像使用T-SQL语言一样完成几乎相同查询,这些的常用功能包括:(1)选择(2)插入(3)更新(4)删除,14.6 LINQ和数据库操作,22,14.6.1 LINQ到SQL基础 LINQ到SQL的使用主要可以分为两大步骤:第一个步骤:创建对象模型。 要实现LINQ 到 SQL,首先必须根据现有关系数据库的元数

21、据创建对象模型。对象模型就是按照开发人员所用的编程语言来表示的数据库。有了这个表示 数据库的对象模型,才能创建查询语句操作数据库。第二个步骤:使用对象模型。 在第一步创建了对象模型后,就可以在该模型中描述信息请求和操作数据,14.6 LINQ和数据库操作,23,14.6.2 数据库对象模型对象模型是关系数据库在编程语言中表示的数据模型,对对象模型的操作就是对关系数据库的操作。下表列举了LINQ到SQL对象模型中最基本的元素及其与关系数据库模型中的元素的对应关系。,14.6 LINQ和数据库操作,24,14.6.2 数据库对象模型对象关系设计器(O/R设计器)提供了一个可视化设计界面,用于创建基

22、于数据库中对象的LINQ到SQL实体类和关联(关系)。换句话说,O/R设计器用于在应用程序中创建映射到数据库中的对象模型。它还生成一个强类型DataContext,用于在实体类与数据库之间发送和接收数据。强类型DataContext对应于类DataContext,它表示LINQ到SQL框架的主入口点,充当SQL Server数据库与映射到数据库的LINQ到SQL实体类之间管道。DataContext 类包含用于连接数据库以及操作数据库数据的连接字符串信息和方法。默认情况下,DataContext类包含多个可以调用的方法,还可以创建其他映射到存储过程和函数的DataContext方法。也可以通过

23、将新的方法添加到DataContext类,对其进行扩展,14.6 LINQ和数据库操作,25,14.6.3 LINQ查询数据库 LINQ到SQL中的查询与LINQ中的查询使用相同的语法,只不过它们操作的对象有所差异,LINQ到SQL查询中引用的是对象映射到数据库中的元素 。应用程序将使用LINQ到SQL 的API来请求查询执行,LINQ到SQL提供程序随后会将查询转换成SQL文本,并委托ADO提供程序执行。ADO提供程序将查询结果作为DataReader返回,而LINQ到SQL提供程序将ADO结果转换成用户对象的IQueryable集合。下图描绘了LINQ到SQL的查询过程。,14.6 LIN

24、Q和数据库操作,26,14.6.3 LINQ查询数据库 从实体类Students中获取查询到的数据,并数据绑定到dataGridView1控件中显示。DataClasses1Data Context data = new DataClasses1DataContext();var StudentsQuery = from student in data.Studentselect student;dataGridView1.DataSource = StudentsQuery;,14.6 LINQ和数据库操作,27,14.6.4 LINQ更改数据库 在LINQ 到 SQL中执行插入、更新和删除

25、操作的方法是:向对象模型中添加对象、或者更改和移除对象模型中的指定对象,然后LINQ到SQL会把所做的操作转化成SQL,最后把这些SQL提交到数据库执行。在默认情况下,LINQ到SQL就会自动生成动态SQL语句来实现插入、读取、更新和操作。(1)使用LINQ向数据库插入行的操作步骤如下:1 创建一个要提交到数据库的新对象。2 将这个新对象添加到与数据库中目标数据表关联的LINQ到SQL Table集合。3将更改提交到数据库。,14.6 LINQ和数据库操作,28,/声明了一个Students实体类的对象stuStudents stu = new Students();/给stu对象的5个属性赋

26、值stu.ID = int.Parse(textBox1.Text);stu.StuName = textBox2.Text;stu.Phone = textBox3.Text;stu.Address = textBox4.Text;stu.City = textBox5.Text;/调用InsertOnSubmit方法向LINQ to SQL Table(TEntity)集合中插入数据dcdc.Students.InsertOnSubmit(stu);/调用方法SubmitChanges提交更改dcdc.SubmitChanges();,14.6 LINQ和数据库操作,29,14.6.4 L

27、INQ更改数据库 (2)使用LINQ修改数据库数据的操作步骤如下:1 查询数据库中要更新的数据行。2 对得到的LINQ 到 SQL对象中成员值进行更改。3 将更改提交到数据库。/从数据库查询到用户选择查询者的对象信息var result = from s in dcdc.Students where s.StuName = comboBox1.SelectedItem.ToString() select s;foreach (var s in result)/通过forech循环更新查询对象的属性值s.Phone = textBox1.Text;s.Address = textBox2.Tex

28、t;s.City = textBox3.Text;dcdc.SubmitChanges(); /把更新提交到数据库以对数据库进行更新,14.6 LINQ和数据库操作,30,14.6.4 LINQ更改数据库 可以通过将对应的LINQ 到 SQL对象从相关的集合中去除来实现删除数据库中的数据行。不过,LINQ 到 SQL不支持且无法识别级联删除操作。如果要在对行有约束的表中删除数据,则必须符合下面的条件之一:1.在数据库的外键约束中设置ON DELETE CASCADE规则。2.编写代码先删除约束表的级联关系。(3)删除数据库中数据行的操作步骤如下:1 查询数据库中要删除的行。2 调用DeleteOnSubmit方法。3 将更改提交到数据库。行更新,14.6 LINQ和数据库操作,31,14.6.4 LINQ更改数据库 var result = from s in dcdc.Studentswhere s.StuName = comboBox1.SelectedItem.ToString()select s;/调用方法DeleteOnSubmit删除获得对象dcdc.Students.DeleteAllOnSubmit(result);/ 把更改提交到数据库对数据进行删除dcdc.SubmitChanges();,14.6 LINQ和数据库操作,32,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报