C-基础管理与设计 11_第1页
已阅读1页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务11设计寝室卫生检查模块C#程序设计LINQ语言集成查询能够将查询功能直接引入到.NET所支持的编程言语中。查询操作可以通过编程语言自身来传达,而不是以字符串形式嵌入到应用程序代码中。本任务将实现智慧寝室管理平台的卫生检查模块,并通过LINQ技术来完成对数据库的操作。任务描述认识LINQLINQ查询基础基本LINQ查询操作使用LINQtoSQL访问SQLServer数据库使用LINQtoDataSet访问SQLServer数据库相关知识LINQ(Language-IntegratedQuery)语言集成查询是一系列直接将查询功能集成到C#语言的技术统称。传统的数据查询都表示为简单的字符串,没有编译时的类型检查或智能感知支持。此外,还需要针对每种类型的数据源使用不同的查询语言。例如:SQL数据库、XML文档、各种Web服务等。借助LINQ技术,查询成为了像类、方法和事件一样的高级语言构造,可以使用语言关键字和熟悉的运算符针对强类型化对象集合编写查询。认识LINQ认识LINQLINQ查询基础基本LINQ查询操作使用LINQtoSQL访问SQLServer数据库使用LINQtoDataSet访问SQLServer数据库相关知识LINQ查询基础0102查询表达式查询变量03var隐式类型本地变量04标准查询运算符05Lambda表达式查询表达式LINQ查询表达式是以查询语法表示的查询。它和其他表达式一样,可以在任何有效的C#表达式上下文中使用。查询表达式由一组用类似于SQL或XQuery的声明性语法编写的子句组成。每个子句进而包含一个或多个C#表达式,而这些表达式可能本身是查询表达式或包含查询表达式。使用查询语法,可以用最少的代码对数据源执行筛选、排序和分组操作。LINQ查询表达式包含8个基本子句。查询表达式子句说

明from指定数据源和范围变量(类似于迭代变量)where基于由逻辑AND和OR运算符(&&或||)分隔的一个或多个布尔表达式筛选源元素select指定执行查询时,所返回序列中元素的类型和形式group根据指定的密钥值对查询结果分组into提供可作为对join、group或select子句结果引用的标识符orderby根据元素类型的默认比较器对查询结果进行升序或降序排序join基于两个指定匹配条件间的相等比较而联接两个数据源let引入范围变量,在查询表达式中存储子表达式结果简单查询表达式示例。查询表达式在LINQ中,查询变量是存储查询而不是查询结果的任何变量,有时仅仅被称为查询。查询变量始终都是可枚举类型,在foreach语句或对其IEnumerator.MoveNext方法的直接调用中循环访问时会生成元素序列。查询变量可以存储采用查询语法、方法语法或是两者的组合进行表示的查询。查询变量查询变量可以使用显式类型,以便显示查询变量与select子句之间的类型关系。也可以使用隐式类型。在C#中可以使用var关键字声明局部变量而无需提供显式类型,指示编译器通过初始化语句右侧的表达式来推断变量的类型。推断类型可以是内置类型、匿名类型、用户定义类型或.NET类库中定义的类型。例如:使用var声明局部变量的代码如下:var隐式类型本地变量vari=5;//i被编译为int类型varstr="Hello";//str被编译为字符串类型vara=new[]{0,1,2};//a被编译为整型数组varanon=new{Name="Marry",Age=25};//anon被编译为匿名类型varlist=newList<int>();//list被编译为List<int>类型//expr被编译为IEnumerable<Customer>或IQueryable<Customer>类型varexpr=fromcinclassInfo wherec.Name=="软件201"selectc;var使用方法示例。var隐式类型本地变量使用LINQ查询表达式语法编写的查询,在编译代码时会被转换为针对.NET公共语言运行时(CLR)的方法调用。这些方法调用会调用标准查询运算符(名称为Where、Select、GroupBy、Join、Max和Average等)。因此,也可以使用方法语法(而不查询语法)来直接调用它们。标准查询运算符是组成LINQ模式的方法。这些方法中的大多数都作用于序列;其中序列指其类型实现IEnumerable<T>接口或IQueryable<T>接口的对象。标准查询运算符提供包括筛选、投影、聚合、排序等在内的查询功能。标准查询运算符LINQ标准查询运算符共有两组,一组作用于类型IEnumerable<T>的对象,另一组作用于类型IQueryable<T>的对象。构成每个集合的方法分别是Enumerable和Queryable类的静态成员。这些方法被定义为作为方法运行目标的类型的扩展方法。可以使用静态方法语法或实例方法语法来调用扩展方法。Enumerable类的常用静态扩展方法如下表所示,Queryable类的常用静态扩展方法与之类似。标准查询运算符方法名称说

明AsEnumerable返回类型化为IEnumerable<T>的输入Average计算序列的平均值FirstOrDefault返回序列中的第一个元素;如果序列中不包含任何元素,则返回默认值LastOrDefault返回序列中的最后一个元素;如果序列中不包含任何元素,则返回默认值Select将序列中的每个元素投影到新表单Where基于谓词筛选序列Lambda表达式用来创建匿名函数。通过使用Lambda表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数。Lambda表达式需要使用Lambda声明运算符“=>”(读作“转到”)从其主体中分离Lambda参数列表。在Lambda运算符左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。Lambda表达式Lambda表达式可以采用以下任意一种形式:(1)表达式lambda,表达式为其主体:(input-parameters)=>expression(2)语句lambda,语句块作为其主体:(input-parameters)=>{<sequence-of-statements>}Lambda表达式使用方法示例。Lambda表达式认识LINQLINQ查询基础基本LINQ查询操作使用LINQtoSQL访问SQLServer数据库使用LINQtoDataSet访问SQLServer数据库相关知识基本LINQ查询操作0102from子句where子句03orderby子句04group子句0506join子句select子句在LINQ查询中,先使用from子句引入数据源和范围变量。例如:若要从学生表Student中获取所有学生信息,LINQ查询表达式代码如下:其中,数据源为Student,范围变量为stuInfo,它就像foreach循环中的迭代变量,但查询表达式中不会真正发生迭代。当执行查询时,范围变量将充当对Student中每个连续的元素的引用。由于编译器可以推断stuInfo的类型,因此无需显式指定它。from子句var

queryStudents

=fromstuInfoinStudent

selectstuInfo;where子句将一个布尔条件(谓词)应用于每个源元素(由范围变量引用),并返回满足指定条件的元素。一个查询表达式可以包含多个where子句,一个子句也可以包含多个谓词子表达式。在where子句中还可以包含一个或多个返回布尔值的方法。例如:若要从学生表(Student)中获取“软件201”班学生的信息,可使用如下代码:

在where子句中可以使用&&和||运算符根据需要指定任意多个谓词。例如,若要返回软件201班学生张三的信息,可使用如下代码:若要返回来自软件201班或软件202班的学生,可使用如下代码:where子句varquery=fromstuInfoinStudent wherestuInfo.班级=="软件201"selectstuInfo;wherestuInfo.班级=="软件201"&&stuInfo.姓名=="张三"wherestuInfo.班级=="软件201"||stuInfo.班级=="软件202"where子句示例。where子句orderby子句在查询表达式中,orderby子句可对返回的序列或子序列(组)以升序或降序排序。若要执行一个或多个次级排序操作,可以指定多个键。默认排序顺序为升序。若要对结果进行逆序排序,可使用orderby…descending子句。例如:若要将学生成绩表(Score)中“C#程序设计”课程成绩按从高到低排序,代码如下:varquery=fromscoreInfoinScore wherescoreInfo.课程=="C#程序设计"orderbyscoreInfo.成绩descendingselectscoreInfo;orderby子句示例。orderby子句group子句用于对根据指定的键所获得的结果进行分组。使用group子句结束查询时,结果将以列表的形式列出。列表中的每个元素都是具有Key成员的对象,列表中的元素根据该键值被分组。在循环访问生成组序列的查询时,必须使用嵌套foreach循环。外层循环循环访问每个组,内层循环循环访问每个组的成员。如果必须引用某个组操作的结果,可使用into关键字创建能被进一步查询的标识符。group子句group子句示例。group子句join联接操作用于将来自不同源序列并且在对象模型中没有直接关系的元素相关联。唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值。在LINQ中,join子句始终作用于对象集合,而非直接作用于数据库表。例如,可通过执行联接来查找所有学生的姓名与成绩,代码如下:join子句varquery=fromstuInfoinStudent joinscoreInfoinScoreonstuInfo.学号equalsscoreInfo.学号 selectnew{学生学号=stuInfo.学号,考试成绩=scoreInfo.成绩};在查询表达式中,select子句指定在执行查询时产生的值的类型。例如,可以指定结果包含的是整个对象、仅一个成员、成员的子集,还是某个基于计算或新对象创建的完全不同的结果类型。当select子句生成除源元素副本以外的内容时,该操作称为“投影”。使用投影转换数据是LINQ查询表达式的一种强大功能。查询表达式必须以select子句或select子句结尾。select子句认识LINQLINQ查询基础基本LINQ查询操作使用LINQtoSQL访问SQLServer数据库使用LINQtoDataSet访问SQLServer数据库相关知识使用LINQtoSQL访问SQLServer数据库0102查询数据插入数据0304更新数据删除数据若要实现LINQtoSQL应用程序,首先要为现有关系数据库的元数据创建对象模型。对象模型按照开发人员所用的编程语言来表示数据库。在VisualStudio集成开发环境中可采用对象关系设计器(O/R设计器)来创建模型。对象关系设计器是一个dbml类型文件。它提供了可视化的设计界面,用于创建基于数据库中对象的LINQtoSQL类和映射到数据库中的对象的对象模型,包括类型化的

DataContext

类和实体类。查询数据名

称类

型说

明Connection属性获取由框架使用的连接CreateDatabase()方法在服务器上创建数据库Equals(Object)方法确定指定对象是否等于当前对象GetTable<TEntity>()方法返回特定类型的对象的集合,其中类型由TEntity参数定义SubmitChanges()方法计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改使用LINQtoSQL技术,查询Scientist数据库中不同研究领域的科学家信息。查询数据使用LINQ向SQLServer数据库中插入数据,需要向已创建的对象模型添加对象。首先调用InsertOnSubmit方法。该方法用来将处于pendinginsert状态的实体插入到对象模型指定的数据表中。其语法格式如下:其中,entity表示要插入的实体。接着需要调用DataContext类的SubmitChanges方法。该方法能够计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改。其语法格式如下:注意:被更新表格的主键必须已经创建,否则更新操作将无法完成。插入数据publicvoidInsertOnSubmit((TEntityentity);publicvoidSubmitChanges();使用LINQ向SQLServer数据库中更新某一数据库项时,首先要检索到该项,然后直接在对象模型中编辑它。在完成对象的修改之后调用SubmitChanges方法以更新数据库。更新数据使用LINQ向SQLServer数据库中删除某一项时,只需要将该项从其所属集合中移除,然后调用SubmitChanges方法即可。DeleteOnSubmit方法用于将此表中的实体置为pendingdelete状态。其语法格式如下:其中,entity表示要删除的实体。删除数据publicvoidDeleteOnSubmit(TEntityentity);认识LINQLINQ查询基础基本LINQ查询操作使用LINQtoSQL访问SQLServer数据库使用LINQtoDataSet访问SQLServer数据库相关知识DataSet是ADO.NE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论