专题二 LINQ与LINQ to Objects.ppt_第1页
专题二 LINQ与LINQ to Objects.ppt_第2页
专题二 LINQ与LINQ to Objects.ppt_第3页
专题二 LINQ与LINQ to Objects.ppt_第4页
专题二 LINQ与LINQ to Objects.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、专题二 LINQ和LINQ to Objects,教学目标,理解LINQ基本概念 掌握常用标准查询操作符 掌握查询表达式编写方法,工作任务,使用LINQ实现员工管理系统。,创建解决方案,在Visual Studio 2008中新建一个控制台应用程序,并将项目命名为“ConsoleLINQEmp”。,创建实体类,在默认添加的Program.cs文件中,创建部门和员工两个实体类,public class Department public int DeptId set; get; /部门编号 public string DeptName set; get; /部门名称 public class E

2、mployee public int EmpId set; get; /员工编号 public string EmpName set; get; /员工姓名 public Department Dept set; get; /所属部门 ,创建GenericQuery 类,在Program.cs文件中再添加一个名为“GenericQuery”的类,先在类中声明两个List类型的属性,再在构造函数中为这两个属性赋值,为LINQ查询准备数据源,public class GenericQuery public List Depts set; get; public List Emps set; get

3、; public GenericQuery() Department dept1 = new Department DeptId = 1, DeptName = 资财部 ; Department dept2 = new Department DeptId = 2, DeptName = 市场部 ; Depts = new List dept1, dept2 ; Employee emp1 = new Employee EmpId = 1002, EmpName = 张三, Dept = dept1 ; Employee emp2 = new Employee EmpId = 1001, Emp

4、Name = 李四, Dept = dept1 ; Employee emp3 = new Employee EmpId = 2001, EmpName = 王五, Dept = dept2 ; Emps = new List emp1, emp2, emp3 ; ,GetEmpsByDeptIdNoOrder 方法,在GenericQuery类中添加一个名为“GetEmpsByDeptIdNoOrder”的方法,根据部门编号查询出该部门的所有员工信息,public IEnumerable GetEmpsByDeptIdNoOrder(int deptid) IEnumerable emplo

5、yees = from e in Empswhere e.Dept.DeptId = deptidselect e; return employees; ,IEnumerable employees = Emps.Where(e = e.Dept.DeptId = deptid);,GetEmpsByDeptIdOrder 方法,根据部门编号查询该部门的员工信息,但是对查询结果按照员工编号进行排序,public IEnumerable GetEmpsByDeptIdOrder(int deptid) IEnumerable employees = from e in Empswhere e.D

6、ept.DeptId = deptidorderby e.EmpIdselect e; return employees; ,IEnumerable employees = Emps.Where(e = e.Dept.DeptId = deptid).OrderBy(e = e.EmpId);,GetEmpsByDeptIdOrderList 方法,将查询的结果转换为存储在缓存中的IList泛型集合,public IList GetEmpsByDeptIdOrderList (int deptid) IList employees = (from e in Emps where e.Dept.

7、DeptId = deptid orderby e.EmpId select e).ToList(); return employees; ,IList employees = Emps.Where(e = e.Dept.DeptId = deptid).OrderBy(e = e.EmpId).ToList();,方法调用,在Program类的Main方法内,创建一个GenericQuery类的实例后分别调用上面创建的三个方法,static void Main(string args) GenericQuery query = new GenericQuery(); IEnumerable

8、empsNoOrder = query.GetEmpsByDeptIdNoOrder(1); IEnumerable empsOrder = query.GetEmpsByDeptIdOrder(1); IList empList = query.GetEmpsByDeptIdOrderList(1); ,输出结果,在Main方法中继续添加代码将查询的结果输出,以不同的形式显示部门1中的员工信息,Console.WriteLine(编号是1的部门包含的员工信息:); Console.WriteLine(未排序:); foreach (Employee emp in empsNoOrder) C

9、onsole.WriteLine(0 1 2 , emp.Dept.DeptName, emp.EmpId, emp.EmpName); Console.WriteLine(); Console.WriteLine(按员工编号排序:); foreach (Employee emp in empsOrder) Console.WriteLine(0 1 2 , emp.Dept.DeptName, emp.EmpId, emp.EmpName); Console.WriteLine(); Console.WriteLine(按员工编号排序,返回IList:); foreach (Employee

10、 emp in empList) Console.WriteLine(0 1 2 , emp.Dept.DeptName, emp.EmpId, emp.EmpName); Console.WriteLine();,添加员工并重新显示,Main方法的最后编写代码添加一名员工 重新显示部门1中的员工信息,query.Emps.Add(new Employee EmpId = 1003, EmpName = 马六, Dept = query.Depts0 );,Console.WriteLine(添加一名员工后编号是1的部门包含的员工信息:); Console.WriteLine(未排序:); f

11、oreach (Employee emp in empsNoOrder) Console.WriteLine(0 1 2 , emp.Dept.DeptName, emp.EmpId,emp.EmpName); Console.WriteLine(); Console.WriteLine(按员工编号排序:); foreach (Employee emp in empsOrder) Console.WriteLine(0 1 2 , emp.Dept.DeptName, emp.EmpId,emp.EmpName); Console.WriteLine(); Console.WriteLine(

12、按员工编号排序,返回IList:); foreach (Employee emp in empList) Console.WriteLine(0 1 2 , emp.Dept.DeptName, emp.EmpId,emp.EmpName); Console.Read();,启动程序,按F5键启动调试,总结,理解LINQ基本概念 掌握常用标准查询操作符 掌握查询表达式编写方法,LINQ介绍,LINQ(Language Intergrated Query,语言集成查询),将一组通用的标准查询运算符集成到了Visual C#和Visual Basic的语言语法中,是一系列标准查询操作符的集合。 L

13、INQ是Visual Studio 2008和.NET Framework 3.5版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。,LINQ查询操作,所有的LINQ查询操作都由以下三个不同的操作组成: 获取数据源 创建查询 执行查询,Class Program static void Main() / 1.获取数据源 int numbers = new int7 0, 1, 2, 3, 4, 5, 6 ; / 2. 创建查询 IEnumerable numQuery = from num in numberswhere (num % 2) = 0select num; / 3.

14、 执行查询 foreach (int num in numQuery) Console.Write(0 , num); ,LINQ创建查询,“创建查询”,只是创建了一个查询变量,并为它赋值,它的功能是保存查询语句;真正的执行要等到第三个操作“执行查询”。,数据源,在.NET中,根据数据源的不同,LINQ提供了以下组件以完成最常用的查询: LINQ to Objects LINQ to XML LINQ to DataSet LINQ to SQL LINQ to Entities,创建查询,LINQ中的“查询”指定要从数据源中检索的信息,并且可以指定在返回这些信息之前如何对其进行排序、分组和结

15、构化。查询存储在查询变量中。 可以通过两种语法来创建查询,即使用查询表达式的查询语法和使用方法的方法语法。,使用查询语法创建查询,查询表达式必须以from子句开头,并且必须以select或group子句结尾。在第一个from子句和最后一个select或group子句之间,查询表达式可以包含一个或多个下列可选子句:where、orderby、join、let甚至附加的from子句。 还可以使用into关键字使join或group子句的结果能够充当同一查询表达式中附加查询子句的源。,var data=from num in numbers where (num % 2) = 0select num

16、;,LINQ to Objects介绍,LINQ to Objects的数据源是任意的IEnumerable或IEnumerable集合,是内存中的数据集合,LINQ可以直接对这两类数据源进行查询,而无需使用数据提供程序。 LINQ to Objects中的数据源集合必须实现IEnumerable或IEnumerable接口。,查询非泛型集合,对于非泛型IEnumerable集合可以调用Cast或OfType方法以将其转换为实现了IEnumerable的集合,这样就能使用完整的标准查询运算符进行查询,IEnumerable query = from s in arrList.Cast(),fr

17、om子句,查询表达式必须以from子句开头,该子句同时指定了数据源和一个范围变量,而且二者都是强类型的,IEnumerable countryAreaQuery = from country in countries where country.Area 500000,select子句,查询表达式必须以select子句或group子句结尾。 select子句指定查询结果的类型。,var queryNameAndPop = from country in countriesselect new Name = country.Name, Pop = country.Population ;,gro

18、up子句,group子句完成的是分组的功能。分组的依据是by关键字后面指定的“键”。,var studentQuery1 = from student in studentsgroup student by student.LastName0;,into关键字,可以在select或group子句中使用into关键字来创建用于存储查询的临时标识符。,var studentQuery = from student in students select student.FirstName + + student.LastName into s select s;,where子句,where子句的功能

19、与SQL语句中的where子句功能基本相同,用来对查询的结果进行筛选或限制,可以根据一个或多个谓词表达式筛选源数据中的某些元素。,IEnumerable queryInt = from num in nums where num = 10 select num;,orderby子句,使用orderby子句可以对查询的结果按升序(ascending)或降序(descending)进行排序。默认情况下是按升序,即ascending关键字可以省略。,IEnumerable sortedStudents = from student in students orderby student.Last a

20、scending, student.First ascending select student;,join子句,使用join子句可以将来自不同源序列的元素相关联。 join子句使用特殊的equals关键字(注意不是“=”或“= =”)比较指定的键是否相等。 join联接类型包含内部联接、分组联接和左外部联接。 join子句的输出形式取决于所执行的联接的具体类型。,内部联接,内部联接:即用C#语言实现的内联接,联接时只能使用equals关键字,进行“同等联接”,满足联接条件的序列可以出现在结果集中。,var innerJoinQuery = from category in categorie

21、s join prod in products on category.ID equals prod.CategoryID select new ProductName = prod.Name, Category = category.Name ;,分组联接,分组联接会产生一个分层的结果序列,该序列将左侧源序列中的元素与右侧源序列中的一个或多个匹配元素相关联。,var innerGroupJoinQuery = from category in categories join prod in products on category.ID equals prod.CategoryID into

22、 prodGroup select new CategoryName = category.Name, Products = prodGroup ;,左外部联接,在左外部联接中,将返回左侧源序列中的所有元素,即使它们在右侧序列中没有匹配的元素也是如此。 若要生成两个集合的左外部联接,可以理解为两步:第一步是使用分组联接,第二步是在结果集内包含第一个(左)集合的每个元素,即使该元素在右集合中没有匹配的元素也是如此,这是通过对分组联接中的每个匹配元素序列调用DefaultIfEmpty方法来实现的。,var leftOuterJoinQuery = from category in categories join prod in produ

温馨提示

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

评论

0/150

提交评论