版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Linq(语言集成查询),主讲人:大牛,本章目标,掌握 LINQ 中的基本概念 掌握 LINQ 的组成 掌握 Linq查询关键字 from where select group into orderby join let equals 掌握基本查询方法 Select() Where() OrderBy() GroupBy(),LINQ要解决的问题,长期以来,开发社区形成以下格局: 面向对象与数据访问两个领域长期分裂,各自为政 编程语言中的数据类型与数据库中的数据类型形成两套体系。例如: C# 中字符串用 string 表示 SQL 中字符串用 NVarchar/Varchar/Char 表示
2、SQL 编码体验落后 没有智能感应 没有严格意义上的强类型和类型检查 SQL 和 XML 都有各自的查询语言,而对象没有自己的查询语言,LINQ 将改变这一切!,LINQ 的历史,最初由 Anders Hejlsberg 构思,最初的研究计划称为 C 2005年9月 第一个为 C# 2.0 开发的技术预览版在当年的 PDC(微软开发者大会)上发布 2005年11月 更新至社区预览版(C# 2.0) 2006年1月 第一个为 VB 8.0 开发的技术预览版发布 2007年11月19日 LINQ作为 .NET Framework 3.5 的一部分正式发布,Anders Hejlsberg,LINQ
3、是什么,LINQ( Language Integrated Query )即语言集成查询 LINQ 是一组语言特性和API,使得你可以使用统一的方式编写各种查询。查询的对象包括XML、对象集合、SQL Server 数据库等等。 LINQ 主要包含以下三部分: LINQ to Objects 主要负责对象的查询(如:集合、数组、字符串等) LINQ to XML 主要负责 XML 的查询 LINQ to ADO.NET 主要负责数据库的查询 LINQ to SQL LINQ to DataSet LINQ to Entities,LINQ 的组成,LNIQ to Objects,LINQ to
4、 ADO.NET,LINQ to XML,C#,VB,Others,LINQ 初体验,在没有LINQ以前,我们这样查询:,int numbers = new int 6, 4, 3, 2, 9, 1, 7, 8, 5 ; List even = new List(); foreach (int number in numbers) if (number % 2 = 0) even.Add(number); even.Sort(); even.Reverse();,从 numbers 数组中提取偶数并降序排列,LINQ 初体验,今天,我们有了LINQ! 我们这样查询:,int numbers =
5、 new int 6, 4, 3, 2, 9, 1, 7, 8, 5 ; var even = numbers .Where(p = p % 2 = 0) .Select(p = p) .OrderByDescending(p = p);,从 numbers 数组中提取偶数并降序排列,演示示例:Hello, LINQ,from 子句,查询表达式必须以 from 子句开头。另外,查询表达式还可以包含子查询,子查询也是以 from 子句开头。 from 子句指定以下内容 将对其运行查询或子查询的数据源。 一个本地范围变量,表示源序列中的每个元素。,int numbers = 5, 4, 1, 3,
6、 9, 8, 6, 7, 2, 0 ; var lowNums = from num in numbers where num 5 select num; foreach (int i in lowNums) Console.Write(i + ); 输出结果: 4 1 3 2 0,范围变量,where 子句,where 子句用在查询表达式中,用于指定将在查询表达式中返回数据源中的哪些元素。一个查询表达式可以包含多个 where 子句,一个子句可以包含多个谓词子表达式。,int numbers = 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 ; var queryLowNums
7、= from num in numbers where num 5 select num; foreach (var s in queryLowNums) Console.Write(s.ToString() + ); 输出结果: 4 1 3 2 0,谓词(布尔条件 ),select 子句,在查询表达式中,select 子句可以指定将在执行查询时产生的值的类型。该子句的结果将基于前面所有子句的计算结果以及 select 子句本身中的所有表达式。查询表达式必须以 select 子句或 group 子句结束。,List Scores = new List() 97, 92, 81, 60 ; IE
8、numerable queryHighScores = from score in Scores where score 80 select score; foreach (int i in queryHighScores) Console.Write(i + ); 输出结果: 97 92 81,group 子句,group 子句返回一个 IGrouping) 对象序列,这些对象包含零个或更多个与该组的键值匹配的项。,var studentQuery2 = from student in students group student by student.Last0 into g orderb
9、y g.Key select g;,in,in 上下文关键字可在下面两种上下文中使用: foreach 语句 查询表达式中的 join 子句,by,by 上下文关键字用在查询表达式的 group 子句中,用于指定如何对返回的项进行分组。,var query = from student in students group student by student.LastName0;,equals,equals 上下文关键字用在查询表达式的 join 子句中,用于比较两个序列的元素。,var innerJoinQuery = from category in categories join pro
10、d in products on category.ID equals prod.CategoryID select new ProductName = prod.Name, Category = category.Name ;,on,on 上下文关键字在查询表达式的 join 子句中用于指定联接条件。,var innerJoinQuery = from category in categories join prod in products on category.ID equals prod.CategoryID select new ProductName = prod.Name, Ca
11、tegory = category.Name ;,descending,descending 上下文关键字用在查询表达式的 orderby 子句中,用于指定从最大到最小的排序顺序。,ascending,ascending 上下文关键字用在查询表达式的 orderby 子句中,用于指定从最小到最大的排序顺序。因为 ascending 是默认排序顺序,所以您无须指定它。,let 子句,基本查询操作符-获取数据,public static IEnumerable Select ( this IEnumerable source, Func selector ),Select(),说明 Select
12、方法本身是一个泛型扩展方法 它作用于IEnumerable类型 它只接受一个 Func 类型参数 Func 是一个泛型委托,位于System名字空间下,System.Core.dll中 在这里 selector 是一个提取器,Select() 例子,var q1 = foxRiver8.Select (name = name.ToLower(); foreach (var item in q1) Console.WriteLine(item); ,以 Lambda 表达式形式出现的Func委托实例,演示示例:Select方法示例,基本查询操作符-过滤数据,public static IEnum
13、erable Where( this IEnumerable source, Func predicate ),Where(),说明 Where方法也是一个泛型扩展方法 它和 Select() 一样作用于IEnumerable类型 它只接受一个 Func 泛型委托参数 在这里 predicate 是一个判断条件,Where() 例子,var q2 = foxRiver8 .Where( name = name.StartsWith(T) .Select(name = name.ToLower(); foreach (var item in q2) Console.WriteLine(item)
14、; ,以 Lambda 表达式形式出现的判断条件,注意返回值要求为 bool 类型,演示示例:Where方法示例,基本查询操作符-排序数据,public static IOrderedEnumerable OrderBy( this IEnumerable source, Func keySelector ),OrderBy(),说明 OrderBy方法也是一个泛型扩展方法 它和 Select() 一样作用于IEnumerable类型 它只接受一个 Func 类型参数 在这里 keySelector 指定要排序的字段 如果想降序排列可以使用OrderByDescending方法,OrderBy
15、() 例子,var q3 = foxRiver8 .Where(name = name.Length 5) .Select(name = name.ToLower() .OrderBy(name = name.Substring(1,1) foreach (var item in q3) Console.WriteLine(item); ,排序字段,这里指定按照姓名的第二个字母升序排列,演示示例:OrderBy方法示例,基本查询操作符-分组数据,public static IEnumerable GroupBy( this IEnumerable source, Func keySelecto
16、r ),GroupBy(),说明 GroupBy方法和OrderBy方法非常类似,它也是一个泛型扩展方法 它和 OrderBy() 一样作用于IEnumerable类型 它只接受一个 Func 类型参数 在这里 keySelector 指定要分组的字段,请注意这个返回值与前面方法的返回值的区别,GroupBy() 例子,var q4 = foxRiver8 .Where(name = name.Length 5) .Select(name = name.ToLower() .GroupBy(name = name.Substring(0, 1); foreach (var group in q
17、4) Console.WriteLine(group.Key); Console.WriteLine(-); foreach (var item in group) Console.WriteLine(item); ,外层循环得到分组,演示示例:GroupBy方法示例,内层循环得到分组中的项,查询执行的时机,int numbers = new int 6, 4, 3, 2, 9, 1, 7, 8, 5 ; var even = numbers .Where(p = p % 2 = 0) .Select(p = Console.WriteLine(Hi! + p.ToString(); retu
18、rn p; );,演示示例:查询的时机,请判断以下代码输出结果是什么?,查询执行的时机,var even = numbers .Where(p = p % 2 = 0) .Select(p = Console.WriteLine(Hi! + p.ToString(); return p; );,int numbers = new int 6, 4, 3, 2, 9, 1, 7, 8, 5 ;,定义查询,获取数据源,执行查询,foreach (var item in even) ,从前面的试验中,我们发现一次查询实际经过以下三步,1,2,3,查询执行的时机小结,查询分为以下三步:获取数据源、定义
19、查询、执行查询; 定义查询后,查询直到需要枚举结果时才被真正执行,这种方式称为“延迟执行(deferred execution)”; 当查询方法返回单一值时,查询立即执行; 因此,可以通过以下技巧在定义查询时就强制执行查询;,var even = numbers .Where(p = p % 2 = 0) .Select(p = Console.WriteLine(Hi! + p.ToString(); return p; ).Count();,LINQ查询的两种方式,事实上,LINQ查询存在以下两种形式 Method Syntax, 查询方法方式 主要利用 System.Linq.Enume
20、rable 类中定义的扩展方法和 Lambda 表达式方式进行查询 上一章的例子都是以这种方式查询 Query Syntax, 查询语句方式 一种更接近 SQL 语法的查询方式 可读性更好,查询语句,int numbers = new int 6, 4, 3, 2, 9, 1, 7, 8, 5 ; var even = numbers .Where(p = p % 2 = 0) .OrderByDescending(p = p) .Select(p = p);,int numbers = new int 6, 4, 3, 2, 9, 1, 7, 8, 5 ; var even = from n
21、umber in numbers where number % 2 = 0 orderby number descending select number;,查询方法,查询语句,演示示例:查询语句与查询方法对比示例,两者的执行效果完全一样,更复杂的查询语句示例,List foxRiver8 = GetFoxRiver8(); var q = from p in foxRiver8 where p.Age = 30 ,演示示例:复杂的查询语句示例,请判断以下代码输出结果是什么?,查询语句vs查询方法,查询语句与查询方法存在着紧密的关系 CLR本身并不理解查询语句,它只理解查询方法 编译器负责在编
22、译时将查询语句翻译为查询方法 大部分查询方法都有对应的查询语句形式:如 Select() 对应 select 、 OrderBy() 对应 orderby 部分查询方法目前在C#中还没有对应的查询语句:如 Count()和Max() 这时只能采用以下替代方案 查询方法 查询语句 + 查询方法的混合方式; 一般情况下,建议使用可读性更好的查询语句,高级查询方法,高级查询方法 聚合类 Count,Max/Min,Average 排序类 ThenBy 分区类 Take,TakeWhile,Skip,SkipWhile 集合类 Distinct 生成类 Range, Repeat,聚合类查询方法,聚合
23、类查询方法,Count Max/Min Average,Count 示例,int count = foxRiver8 .Where(p = p.Age = 30) .Count();,int count = (from p in foxRiver8 where p.Age = 30 select p).Count();,纯粹查询方法模式,混合模式,演示示例:Count 方法示例,Count 返回集合项的数目,Max 示例,int maxAge = foxRiver8 .Select(p = p.Age) .Max();,int maxAge = (from p in foxRiver8 sel
24、ect p.Age).Max();,纯粹查询方法模式,混合模式,演示示例:Max 方法示例,Max 返回集合中的最大值,Min 示例,int maxAge = foxRiver8 .Select(p = p.Age) .Min();,int maxAge = (from p in foxRiver8 select p.Age).Min();,纯粹查询方法模式,混合模式,演示示例:Min 方法示例,Min 返回集合中的最小值,Average 示例,double averageAge = foxRiver8 .Select(p = p.Age) .Average();,double average
25、Age = (from p in foxRiver8 select p.Age).Average();,纯粹查询方法模式,混合模式,演示示例:Average 方法示例,Average 返回集合的平均值,Sum 示例,int sumAge = foxRiver8 .Select(p = p.Age) .Sum();,Int sumAge = (from p in foxRiver8 select p.Age).Sum();,纯粹查询方法模式,混合模式,演示示例:Sum 方法示例,Sum 返回集合的总和,排序类查询方法,排序类查询方法,ThenBy,ThenBy 示例,var q = from p
26、 in foxRiver8 orderby p.FirstName, p.LasName, p.Age select p;,var q = foxRiver8 .OrderBy(p = p.FirstName) .ThenBy(p = p.LasName) .ThenBy(p = p.Age);,查询语句,查询方法,演示示例:ThenBy 方法示例,ThenBy 提供复合排序条件,分区类查询方法,分区类查询方法,Take/TakeWhile Skip/SkipWhile,Take/Skip 示例,int numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9 ; var q =
27、 numbers.Skip(1).Take(3); foreach (var item in q) Console.WriteLine(item); ,演示示例:Skip/Take 方法示例,Take 提取指定数量的项 Skip 跳过指定数量的项并获取剩余的项,跳过前1条记录,连续提取3条记录,得到 2 3 4,TakeWhile/SkipWhile 示例,演示示例:SkipWhile/TakeWhile 方法示例,TakeWhile 根据指定条件提取项 SkipWhile 根据指定条件跳过项,int numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9 ; var q =
28、numbers.SkipWhile(i = i % 3 != 0) .TakeWhile(i = i % 2 != 0); foreach (var item in q) Console.WriteLine(item); ,分区类查询方法小结,请判断以下代码输出结果是什么?,int numbers = 1, 2, 3, 4, 5, 6, 7, 8, 9 ; var q = numbers.Skip(1).Take(3).Skip(1).Take(2); foreach (var item in q) Console.WriteLine(item); ,输出: 3 4,集合类查询方法,集合类查询
29、方法,Distinct,Distinct 示例,演示示例:Distinct 方法示例,Distinct 去掉集合中的重复项,int factorsOf300 = 2, 2, 3, 5, 5 ; var uniqueFactors = factorsOf300.Distinct();,输出: 2 3 5,生成类查询方法,生成类查询方法,Range Repeat,Range 示例,演示示例:Range 方法示例,Range 生成一个整数序列,var numbers =Enumerable.Range(1, 10); foreach (var item in numbers) Console.Wri
30、teLine(item); ,Repeat 示例,演示示例:Repeat 方法示例,Repeat 生成一个重复项的序列,var numbers = Enumerable.Repeat(“Beijing 2008”, 10); foreach (var item in numbers) Console.WriteLine(item); ,生成类查询方法小结,使用生成类查询方法时,需要注意以下几点: 和其他几类方法不同,Range/Repeat 不是扩展方法,而是普通的静态方法 Range 只能产生整数序列 Repeat 可以产生泛型序列 所有的查询方法都存放在 System.Linq.Enume
31、rable 静态类中,LINQ to SQL 示例,下面我们利用已经学习的 LINQ 知识,做一个示例 显示“第三波书店”中所有书籍类型 根据用户选择的书籍类型显示书籍列表 提供分页功能: 首页 上一页 下一页 末页 页码选择,设计界面,关键步骤 新建 “ASP.NET Web Site” 项目 在 “Solution Explorer” 中依次选择 “Add New Item” - “Web Form” 为网页命名为 ListBooksByCategory.aspx 设计简单的用户界面,设计好后的界面如图所示,配置数据源,关键步骤 在 “Database Explorer” 中选择 “Add
32、 Connection”,并指定 MyBookShop 数据库 在 “Solution Explorer” 中依次选择 “Add New Item” - “LINQ to SQL Classes” 为dbml文件命名为 MyBookShop.dbml 展开数据源视图,把 MyBookShop 数据库中的表 Books, Categories, Publishers 拖到 LINQ to SQL 的设计器中 最终效果如图,编写代码,在 Page_Load 中编写代码进行初始化,private const int PAGE_SIZE = 20; MyBookShopDataContext db; protected void Page_Load(object sender, EventArgs e) db = new MyBookShopDat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第14课 鸟鸣枝头说课稿2025学年初中艺术·美术岭南美版2024七年级下册-岭南美版2024
- 2026年说课稿我和昆虫人美
- 2026年田野在召唤说课稿
- 2026及未来5年焊接钢筋网项目可行性研究报告(市场调查与数据分析)
- 2026及未来5年汽车自动升降器开关总成项目可行性研究报告(市场调查与数据分析)
- 2026年天窗板块说课稿
- 2026年中班教学活动设计排队喝水
- 2026及未来5年校园广播与现场直播系统项目可行性研究报告(市场调查与数据分析)
- 2026及未来5年有机玻璃圆管项目可行性研究报告(市场调查与数据分析)
- 初中2025理解沟通说课稿
- 中医病证诊断疗效
- GB/T 2970-2016厚钢板超声检测方法
- 智能农业实验报告
- GB/T 23445-2009聚合物水泥防水涂料
- 人工神经网络HOPFIELD神经网络
- 中小学生励志主题班会课件《告诉你孩子:几年的放纵-换来的是一生卑微和坎坷》
- 2022年山东司法警官职业学院单招综合素质考试笔试试题及答案解析
- 022pet热灌装饮料生产工艺及品质控制
- (完整版)英语高频词汇800词
- 墙板安装工艺流程
- 三年级下册语文教案- 习作八 这样想象真有趣 人教部编版
评论
0/150
提交评论