专题二 LINQ和LINQ to Objects

更新时间:2023-05-29 17:00:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

linq

专题二 LINQ和LINQ to Objects

Hands-On实训教程系列

linq

教学目标理解LINQ基本概念 掌握常用标准查询操作符 掌握查询表达式编写方法

Hands-On实训教程系列

linq

工作任务

使用LINQ实现员工管理系统。

Hands-On实训教程系列

linq

创建解决方案

在Visual Studio 2008中新建一个控制台应用 程序,并将项目命名为“ConsoleLINQEmp”。

Hands-On实训教程系列

linq

创建实体类

在默认添加的Program.cs文件中,创建部门 和员工两个实体类public class Department { public int DeptId { set; get; } //部门编号 public string DeptName { set; get; } //部门名称 } public class Employee { public int EmpId { set; get; } //员工编号 public string EmpName { set; get; } //员工姓名 public Department Dept { set; get; } //所属部门 }

Hands-On实训教程系列

linq

创建GenericQuery 类

在Program.cs文件中再添加一个名为 “GenericQuery”的类,先在类中声明两个 List类型的属性,再在构造函数中为这两个属 性赋值,为LINQ查询准备数据源public class GenericQuery { public List<Department> Depts { set; get; } public List<Employee> Emps { set; get; } public GenericQuery() { Department dept1 = new Department { DeptId = 1, DeptName = "资财部" }; Department dept2 = new Department { DeptId = 2, DeptName = "市场部" }; Depts = new List<Department> { dept1, dept2 }; Employee emp1 = new Employee { EmpId = 1002, EmpName = "张三", Dept = dept1 }; Employee emp2 = new Employee { EmpId = 1001, EmpName = "李四", Dept = dept1 }; Employee emp3 = new Employee { EmpId = 2001, EmpName = "王五", Dept = dept2 }; Emps = new List<Employee> { emp1, emp2, emp3 }; } }

Hands-On实训教程系列

linq

GetEmpsByDeptIdNoOrder 方法

在GenericQuery类中添加一个名为 “GetEmpsByDeptIdNoOrder”的方法,根 据部门编号查询出该部门的所有员工信息public IEnumerable<Employee> GetEmpsByDeptIdNoOrder(int deptid) { IEnumerable<Employee> employees = from e in Emps where e.Dept.DeptId == deptid select e; return employees; } IEnumerable<Employee> employees = Emps.Where(e => e.Dept.DeptId == deptid);

Hands-On实训教程系列

linq

GetEmpsByDeptIdOrder 方法

根据部门编号查询该部门的员工信息,但是对 查询结果按照员工编号进行排序public IEnumerable<Employee> GetEmpsByDeptIdOrder(int deptid) { IEnumerable<Employee> employees = from e in Emps where e.Dept.DeptId == deptid orderby e.EmpId select e; return employees; } IEnumerable<Employee> employees = Emps.Where(e => e.Dept.DeptId == deptid).OrderBy(e => e.EmpId); Hands-On实训教程系列

linq

GetEmpsByDeptIdOrderList 方法

将查询的结果转换为存储在缓存中的IList泛型 集合,public IList<Employee> GetEmpsByDeptIdOrderList (int deptid) { IList<Employee> employees = (from e in Emps where e.Dept.DeptId == deptid orderby e.EmpId select e).ToList(); return employees; } IList<Employee> employees =

Emps.Where(e => e.Dept.DeptId == deptid).OrderBy (e => e.EmpId).ToList();

Hands-On实训教程系列

linq

方法调用

在Program类的Main方法内,创建一个 GenericQuery类的实例后分别调用上面创建 的三个方法static void Main(string[] args) { GenericQuery query = new GenericQuery(); IEnumerable<Employee> empsNoOrder = query.GetEmpsByDeptIdNoOrder(1); IEnumerable<Employee> empsOrder = query.GetEmpsByDeptIdOrder(1); IList<Employee> empList = query.GetEmpsByDeptIdOrderList(1); }

Hands-On实训教程系列

linq

输出结果

在Main方法中继续添加代码将查询的结果输 出,以不同的形式显示部门1中的员工信息Console.WriteLine("编号是1的部门包含的员工信息:"); Console.WriteLine("未排序:"); foreach (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("按员工编号排序,返回IList:"); foreach (Employee emp in empList) { Console.WriteLine("{0} {1} {2} ", emp.Dept.DeptName, emp.EmpId, emp.EmpName); } Console.WriteLine();

Hands-On实训教程系列

linq

添加员工并重新显示

Main方法的最后编写代码添加一名员工query.Emps.Add(new Employee { EmpId = 1003, EmpName = "马六", Dept = query.Depts[0] });

重新显示部门1中的员工信息Console.WriteLine("添加一名员工后编号是1的部门包含的员工信息:"); Console.WriteLine("未排序:"); foreach (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("按员工编号排序,返回IList:"); foreach (Employee emp in empList) { Console.WriteLine("{0} {1} {2} ", emp.Dept.DeptName, emp.EmpId,emp.EmpName); } Console.Read();

Hands-On实训教程系列

linq

启动程序

按F5键启动调试

Hands-On实训教程系列

linq

总结理解LINQ基本概念 掌握常用标准查询操作符 掌握查询表达式编写方法

Hands-On实训教程系列

linq

LINQ介绍LINQ(Language Intergrated Query,语言 集成查询),将一组通用的标准查询运算符集 成到了Visual C#和Visual Basic的语言语法 中,是一系列标准查询操作符的集合。 LINQ是Visual Studio 2008和.NET Framework 3.5版中一项突破性的创新,它在 对象领域和数据领域之间架起了一座桥梁。

Hands-On实训教程系列

linq

LINQ查询操作所有的LINQ查询操作都由以下三个不同的操 作组成: Class Program { static void 获取数据源 Main() { // 1.获取数据源 创建查询 in

t[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; // 2. 创建查询 numQuery = 执行查询 IEnumerable<int>(num % 2) == from num in numbers where 0 select num; // 3. 执行查询 foreach (int num in numQuery) { Console.Write("{0} ", num); } } }

Hands-On实训教程系列

linq

LINQ创建查询

“创建查询”,只是创建了一个查询变量,并 为它赋值,它的功能是保存查询语句;真正的 执行要等到第三个操作“执行查询”。

Hands-On实训教程系列

linq

数据源在.NET中,根据数据源的不同,LINQ提供了 以下组件以完成最常用的查询: LINQ to Objects LINQ to XML LINQ to DataSet LINQ to SQL LINQ to Entities

Hands-On实训教程系列

linq

创建查询LINQ中的“查询”指定要从数据源中检索的 信息,并且可以指定在返回这些信息之前如何 对其进行排序、分组和结构化。查询存储在查 询变量中。 可以通过两种语法来创建查询,即使用查询表 达式的查询语法和使用方法的方法语法。

Hands-On实训教程系列

linq

使用查询语法创建查询查询表达式必须以from子句开头,并且必须 以select或group子句结尾。在第一个from子 句和最后一个select或group子句之间,查询 表达式可以包含一个或多个下列可选子句: where、orderby、join、let甚至附加的from var 0 子句。 data=from num in numbers where (num % 2) ==select num; 还可以使用into关键字使join或group子句的 结果能够充当同一查询表达式中附加查询子句 的源。 Hands-On实训教程系列

linq

LINQ to Objects介绍LINQ to Objects的数据源是任意的 IEnumerable或IEnumerable<T>集合,是内 存中的数据集合,LINQ可以直接对这两类数 据源进行查询,而无需使用数据提供程序。 LINQ to Objects中的数据源集合必须实现 IEnumerable<T>或IEnumerable接口。

Hands-On实训教程系列

本文来源:https://www.bwwdw.com/article/ejg4.html

Top