LinQ教学讲义PPT
C#基础知识系列-7Linq详解

C#基础知识系列-7Linq详解前言在上一篇中简单介绍了Linq的入门级用法,这一篇尝试讲解一些更加深入的使用方法,与前一篇的结构不一样的地方是,这一篇我会先介绍Linq里的支持方法,然后以实际需求为引导,分别以方法链的形式和类SQL的形式写出来。
前置概念介绍1.Predicate<T> 谓词、断言,等价于Func<T,bool> 即返回bool的表达式2.Expression<TDelegate> 表达式树,这个类很关键,但是在这里会细说,我们会讲它的一个特殊的泛型类型:Expression<Func<T,bool>> 这个在某些数据源的查询中十分重要,它代表lambda表达式中一种特殊的表达式,即没有大括号和return 关键字的那种。
我们先准备两个类:1.Student/学生类:/// <summary>/// 学生/// </summary>public class Student{/// <summary>/// 学号/// </summary>public int StudentId { get; set; }/// <summary>/// 姓名/// </summary>public string Name { get; set; }/// <summary>/// 班级/// </summary>public string Class { get; set; }/// <summary>/// 年龄/// </summary>public int Age { get; set; }}2.Subject/科目类:3./// <summary>4./// 科目5./// </summary>6.public class Subject7.{8./// <summary>9./// 名称10./// </summary>11.public string Name { get; set; }12./// <summary>13./// 年级14./// </summary>15.public string Grade { get; set; }16./// <summary>17./// 学号18./// </summary>19.public int StudentId { get; set; }20./// <summary>21./// 成绩22./// </summary>23.public int Score { get; set; }24.}Subject 和Student通过学号字段一一关联,实际工作中数据表有可能会设计成这。
LinQ查询语言

语言集成查询(LINQ)课程大纲•什么是LINQ?•查询基本操作(查询关键字)– from子句– where子句– select子句– group子句– into子句– orderby子句– join子句2什么是LINQ?•传统的查询Select FirstName,LastName from Customers Where city=‘Shanghai’Order by district1、简单的字符串。
2、没有编译时候的类型检查。
3、没有IDE编译环境的只能感知。
以上的例子只是针对SQLSERVER,针对不同的数据源,例如XML 文档、各种Web 服务等我们还要学习不同的查询方法………3什么是LINQ?•LINQ是语言集成查询(Language Integrated Query)的简称,是Visual Studio 2008 和.NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁•支持各种数据源4什么是LINQ?•所有LINQ 查询操作都由以下三个不同的操作组成– 获取数据源– 创建查询– 执行查询5数据源•数据源–在上一个示例中,由于数据源是数组,因此它隐式支持泛型IEnumerable(T)接口。
这一事实意味着该数据源可以用LINQ 进行查询。
–在foreach 语句中执行查询,而foreach 要求使用IEnumerable或Ienumerable(T)。
支持Ienumerable(T)或派生接口(如泛型Iqueryable(T)的类型称为“可查询类型”。
6创建查询•查询–查询指定要从数据源中检索的信息–查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化–查询存储在查询变量中,并用查询表达式进行初始化。
为使编写查询的工作变得更加容易,C# 引入了新的查询语法7执行查询•执行查询–延迟执行:询变量本身只是存储查询命令。
实际的查询执行会延迟到在foreach 语句中循环访问查询变量时发生。
课件:第5章 - 泛型与LINQ

•
Console.WriteLine("String:" + test1.obj);
•
Console.Read();
•
}
•}
•
• class Test<T>
•{
•
public T obj;
•
public Test(T obj)
•
{
•
this.obj = obj;
•
}
•}
13
泛型
• class Program
8
对象与集合初始化器
• 对象初始化器 • Student stu= new Student(){ Id = 1, Name =
“YJingLee”, Age = 22 }; 更方便给对象赋值,提高编 程速度。 • 集合初始化器 • List<int> num = new List<int> (){ 0, 1, 2, 6, 7, 8, 9 }; • List< Student > stus= new List< Student > { new Student{Id=1,Name="YJingLee",Age=22}, new Student{Id=2,Name="XieQing",Age=25}, };
Console.WriteLine(MyProp); } }
11
泛型 例如: MyClass<int> myclass = new MyClass<int>(); myclass.MyProp = 15; myclass.Print();
12
泛型
LINQ从基础到项目实战PPT第6章 LINQ综合应用实例

6.2.1
需求分析
(3)客户端运行环境
◦ ①浏览器:Internet Explorer 6.0及以上 ◦ ②分辨率:最佳效果1024×768像素
6.3 系统总体结构设计
本节主要讲述系统功能设计以及数据库功能 设计,其中系统功能设计主要是根据系统功 能来决定系统的模块结构,并决定数据库设 计,数据库设计与程序运行的效率有着密切 的关系,因此,数据库设计的是否合理是系 统运行效率高低的关键因素之一。
6.5.4
{
注销管理员的登录
FormsAuthentication.SignOut(); //删除Cookie中保存的用户信息 Response.Redirect("~/"); //重定向到首页
protected void Page_Load(object sender, EventArgs e)
6.3.1
模块设计
企业信息管理系统
产品类别
产品信息
客户类别
客户信息
添 加 产 类 品 类 管 别 理 别 品
产 添 加 产 品 信
产 添 品 信 客 息 管 息 理 别 类 户 加
客 户 类 客 别 管 理 息 信 户 加 添
客 户 信 息 管 理
企业信息管理系统
6.3.2
字段名 LoginId LoginName
客户信息表(User)
Uniqueidentifier Uniqueidentifier nvarchar(50)
Address Phone Email
nvarchar(50) nvarchar(50) nvarchar(50)
6.3.2
系统数据库设计
各个表之间的关系
03 第三讲 基本的LINQ查询

第三讲基本的LINQ查询本讲介绍LINQ查询语法中的关键字,为以后的查询实体框架打下基础,本讲要介绍的关键字包括:查询表达式必须以 from 子句开头。
另外,查询表达式还可以包含子查询,子查询也是以 from 子句开头。
from 子句指定以下内容:●将对其运行查询或子查询的数据源。
●一个本地范围变量,表示源序列中的每个元素。
范围变量和数据源都是强类型。
from 子句中引用的数据源的类型必须为IEnumerable、IEnumerable<T>或一种派生类型(如 IQueryable<T>)。
在下面的示例中,numbers 是数据源,而 num 是范围变量。
请注意,这两个变量都是强类型,即使使用了 var 关键字也是如此。
class LowNums{static void Main(){// A simple data source.int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };// Create the query.// lowNums is an IEnumerable<int>var lowNums = from num in numbers where num < 5 select num;// Execute the query.foreach (int i in lowNums){Console.Write(i + " ");}}}// Output: 4 1 3 2 01.1范围变量如果数据源实现了 IEnumerable<T>,则编译器可以推断范围变量的类型。
例如,如果数据源的类型为 IEnumerable<Customer>,则推断出范围变量的类型为 Customer。
仅当数据源是非泛型 IEnumerable 类型(如 ArrayList)时,才必须显式指定数据源类型。
01 第一讲 LINQ简介

第一讲 LINQ简介1. LINQ 介绍语言集成查询 (LINQ) 是 Visual Studio 2008 和 .NET Framework 3.5 版中一项突破性的创新,它在对象领域和数据领域之间架起了一座桥梁。
知识点:什么是ORM(Object Relational Mapping对象关系映射)它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。
对象关系映射是随着面向对象的软件开发方法发展而产生的。
面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。
对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。
内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。
因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。
为了解决这个不匹配的现象,对象关系映射技术应运而生。
让我们从O/R开始。
字母O起源于"对象"(Object),而R则来自于"关系"(Relational)。
几乎所有的程序里面,都存在对象和关系数据库。
在业务逻辑层和用户界面层中,我们是面向对象的。
当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。
你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。
而这些代码写起来总是重复的。
LINQ从基础到项目实战PPT第4章 LINQ to SQL

4.1
LINQ to SQL基础
下面的一段代码是使用LINQ to SQL对数据库 中的数据进行查询操作。
BookDataContext ctx = new BookDataContext(); //创建数据库通信对象 var books = from p in ctx.Book where p.BOOKID == 99 //LINQ to SQL查询表达式 select p;
使用内联属性inlineattribute建立映射是指通过在实体类的定义代码中使用一些特定的属性attribute修饰类名或者属性的属性修饰类名或者属性property来指定该类或者该属性具体映射到数据库中的表或者表的某一列的方法下面通过一个具体的实例41来演示如何使用内联属性方法来建立对象关系映射
4.2.1
使用内联属性
【添加引用】窗口
4.2.2
使用XML映射文件
一个XML映射文件由一系列的节点(Node)构成, 其中根节点是一个Database元素(element), 用来指定要映射的数据库信息。Database元素可 以包含一个或者多个Table元素,用于指定将要 映射的物理表信息,Table元素由一个Type元素 和多个Column元素(或Association元素)组成。 其中,Type元素用来指定实体类;Column元素用 来指定列信息;Association元素用来建立主键外键关联关系。与内联属性不同的是,这里的 Column元素包含一个Member属性(attribute), 用来指定映射到实体类的属性(property)名称。
4.2.1
使用内联属性
【解决方案资源管理器】窗口
4.2.1
使用内联属性
为了在代码中使用LINQ to SQL的功能,需要 向项目添加System.Data.Linq的引用。右击 【解决方案资源管理器】窗口中的【引用】, 在打开的右键菜单中单击【添加引用】命令, 为项目添加System.Data.Linq的引用,【添 加引用】窗口如图所示。
C#程序设计实用教程第11章 LINQ

11.4 LinqDataSource控件实现数据的增、删、改 • 建立一个Linq To Sql数据模型的方法如下所示。 • (1)右击解决方案名称,在弹出的快捷菜单上选择“添加
新项”选项,打开“添加新项”对话框,在模板中选择 “LINQ to SQL”选项。 • (2)单击“添加”按钮,将出现警告框,询问是否将该项 放到App_Code文件夹中,单击“是”按钮,将会添加一个 Linq To Sql数据模型到解决方案中。 • (3)接下来就可以进行数据模型的设计了。还可以直接从 “服务器资源管理器”中拖动相关的数据表到设计面板中 。 • 建立好数据模型之后,就可进行LinqDataSource控件的数 据源配置了
11.1.1 为什么要使用LINQ
• 现在的数据格式越来越多,数据库、XML、数组、 哈希表„„每一种都有自己操作数据的方式,全 部掌握就显得比较吃力。而LINQ则以一种统一的 方式操作各种数据源,减少数据访问的复杂性。 • LINQ带来很多开发上的便利。首先,可以利用 Visual Studio 2010这个强大的IDE,来进行SQL 语句编写时,可以有智能感应功能,这比起在SQL Server中使用查询分析器写SQL语句就方便多了, 同时它可以把数据当成一个对象来操作。 • LINQ包括5个部分:LINQ To Objects、LINQ To DataSets、LINQ To SQL、LINQ To Entities、 LINQ To XML。
11.2 LINQ对数据集(Dataset)的操作
• DataSet是中使用频率最高的组件之一, 但DataSet也限制了查询功能。通过使用可用于许 多其他数据源的相同查询功能,LINQ to DataSet 可将更丰富的查询功能应用于同DataSet的交互中 。通过使用LINQ to DataSet,可以更快更容易地 查询在DataSet对象中缓存的数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本查询操作符-过滤数据 基本查询操作符 过滤数据
Where()
public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate )
说明 Where方法也是一个泛型扩展方法 它和 Select() 一样作用于IEnumerable<TSource>类型 它只接受一个 Func<TSource, bool> 泛型委托参数 在这里 predicate 是一个判断条件
3
执行查询
foreach (var item in even) { }
查询执行的时机小结
查询分为以下三步:获取数据源、定义查 询、执行查询; 定义查询后,查询直到需要枚举结果时才 被真正执行,这种方式称为“延迟执行 (deferred execution)”; 当查询方法返回单一值时,查询立即执行; 因此,可以通过以下技巧在定义查询时就 强制执行查询;
基本查询操作符-分组数据 基本查询操作符 分组数据
请注意这个返回值与前面 方法的返回值的区别
GroupBy()
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>( this IEnumerable<TSource> source, Func<TSource, TKey> key面的试验中,我们发现一次查询实际经过以下三步 1
获取数据源 int[] numbers = new int[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 };
2
定义查询
var even = numbers .Where(p => p % 2 == 0) .Select(p => { Console.WriteLine("Hi! " + p.ToString()); return p; });
Lambda表达式语法 表达式语法
最基本的 Lambda 表达式语法如下:
(参数列表 => {方法体 参数列表) 方法体} 参数列表 方法体
说明 参数列表中的参数类型可以是明确类 型或者是推断类型 如果是推断类型,则参数的数据类型 将由编译器根据上下文自动推断出来
基本查询操作符-获取数据 基本查询操作符 获取数据
说明 GroupBy方法和OrderBy方法非常类似,它也是一个 泛型扩展方法 它和 OrderBy() 一样作用于IEnumerable<TSource> 类型 它只接受一个 Func<TSource, TKey > 类型参数 在这里 keySelector 指定要分组的字段
GroupBy() 例子
一种更接近 SQL 语法的查询方式 可读性更好
查询语句vs查询方法 查询语句 查询方法
查询语句与查询方法存在着紧密的关系 CLR本身并不理解查询语句,它只理解查询方法 编译器负责在编译时将查询语句翻译为查询方法 大部分查询方法都有对应的查询语句形式:如 Select() 对 应 select 、 OrderBy() 对应 orderby 部分查询方法目前在C#中还没有对应的查询语句:如 Count()和Max() 这时只能采用以下替代方案 查询方法 查询语句 + 查询方法的混合方式; 一般情况下,建议使用可读性更好的查询语句
LINQ查询的两种方式 查询的两种方式
事实上,LINQ查询存在以下两种形式 Method Syntax, 查询方法方式
主要利用 System.Linq.Enumerable 类中定义 的扩展方法和 Lambda 表达式方式进行查询 上一章的例子都是以这种方式查询
Query Syntax, 查询语句方式
var q4 = foxRiver8 .Where(name => name.Length > 5) .Select(name => name.ToLower()) .GroupBy(name => name.Substring(0, 1)); foreach (var group in q4) { Console.WriteLine(group.Key); Console.WriteLine("--------------------"); foreach (var item in group) { Console.WriteLine(item); } }
LinQ
目标
掌握 LINQ 中的基本概念 理解扩展方法/Lambda 表达式 查询LINQ方法 Select()/Where()/OrderBy()/GroupBy() 掌握LINQ语句 理解查询语句与查询方法的关系 掌握各种高级查询方法 理解 LINQ to SQL
前言
经过了最近 20 年,面向对象编程技术在工业领域的应用已经进入了一个稳定的 发展阶段。程序员现在都已经认同像类、对象、方法这样的语言特性。考察现在 和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术 诞生以来并没有解决降低访问和整合信息数据的复杂度的问题。其中两个最主要 访问的数据源与数据库和 XML 相关。 作为微软开发的查询方案,LINQ 提供了一条更常规的途径即给 .Net Framework 添加一些可以应用于所有信息源的具有多种用途的语法查询特性,这是比向开发 语言和运行时添加一些关系数据特性或者类似 XML 特性)更好的方式。这些语 法特性就叫做 .NET Language Integrated Query (LINQ) 。
LINQ 的历史
最初由 Anders Hejlsberg 构 思,最初的研究计划称为 Cω 2007年11月19日 – LINQ作 为 .NET Framework 3.5 的一 部分正式发布
Anders Hejlsberg
LINQ要解决的问题 要解决的问题
面向对象与数据访问两个领域长期分裂, 各自为政 编程语言中的数据类型与数据库中的数据 类型形成两套体系。 SQL 编码体验落后 SQL 和 XML 都有各自的查询语言,而对象 没有自己的查询语言
说明 OrderBy方法也是一个泛型扩展方法 它和 Select() 一样作用于IEnumerable<TSource>类型 它只接受一个 Func<TSource, TKey > 类型参数 在这里 keySelector 指定要排序的字段 如果想降序排列可以使用OrderByDescending方法
LINQ是什么 是什么
LINQ( Language Integrated Query )即 语言集成查询 LINQ 主要包含以下三部分:
LINQ to Objects 主要负责对象的查询 LINQ to XML 主要负责 XML 的查询 LINQ to 主要负责数据库的查询
• LINQ to SQL • LINQ to DataSet • LINQ to Entities
Objects
Relational
XML
LINQ 初体验
扩展方法
目的: 对已存在类型的行为进行扩展: public static class classA {public static void ExtraMethod(this string s){…}} 注意事项: 扩展方法是一种特殊的静态方法 扩展方法必须在静态类中定义 扩展方法的优先级低于同名的类方法 扩展方法只在特定的命名空间内有效 除非必须不要滥用扩展方法
高级查询方法
高级查询方法 聚合类 Count,Max/Min,Average 排序类 ThenBy 分区类 Take,TakeWhile,Skip,SkipWhile 集合类 Distinct 生成类 Range, Repeat
生成类查询方法小结
使用生成类查询方法时,需要注意以下几点: 和其他几类方法不同,Range/Repeat 不是 扩展方法,而是普通的静态方法 Range 只能产生整数序列 Repeat 可以产生泛型序列 所有的查询方法都存放在 System.Linq.Enumerable 静态类中
LINQ to SQL 示例
Select()
public static IEnumerable<TResult> Select<TSource, TResult> ( this IEnumerable<TSource> source, Func<TSource, TResult> selector )
说明 Select 方法本身是一个泛型扩展方法 它作用于IEnumerable<TSource>类型 它只接受一个 Func<TSource, TResult> 类型参数 Func<TSource, TResult> 是一个泛型委托,位于 System名字空间下,System.Core.dll中 在这里 selector 是一个提取器
LINQ 的组成
C# VB Others…
.NET Language Integrated Query
LNIQ to Objects Objects LINQ to LINQ to XML
<book> <title/> <author/> <year/> <price/> </book>
基本查询操作符-排序数据 基本查询操作符 排序数据
OrderBy()
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>( this IEnumerable<TSource> source, Func<TSource, TKey> keySelector )