第二章[Linq介绍和查询表达式]
LINQ教程之LINQ操作语法

LINQ教程之LINQ操作语法LINQ查询时有两种语法可供选择:查询表达式语法(Query Expression)和⽅法语法(Fluent Syntax)。
⼀、查询表达式语法查询表达式语法是⼀种更接近SQL语法的查询⽅式。
LINQ查询表达式语法如下:from<range variable> in <IEnumerable<T> or IQueryable<T> Collection><Standard Query Operators> <lambda expression><select or groupBy operator> <result formation>LINQ查询表达式约束LINQ查询表达式必须以from⼦句开头,以select或group⼦句介绍关键字功能from....in...指定要查询的数据源以及范围变量,多个from⼦句则表⽰从多个数据源查找数据。
注意:C#编译器会把“复合from⼦句”的查询表达式转换为SelectMany()扩展⽅法。
join…in…on…equals…指定多个数据源的关联⽅式let引⼊⽤于存储查询表达式中⼦表达式结果的范围变量。
通常能达到层次感会更好,使代码更易于阅读。
orderby、descending 指定元素的排序字段和排序⽅式。
当有多个排序字段时,由字段顺序确定主次关系,可指定升序和降序两种排序⽅式where指定元素的筛选条件。
多个where⼦句则表⽰了并列条件,必须全部都满⾜才能⼊选。
每个where⼦句可以使⽤谓词&&、||连接多个条件表达式。
group指定元素的分组字段。
select指定查询要返回的⽬标数据,可以指定任何类型,甚⾄是匿名类型。
(⽬前通常被指定为匿名类型)into 提供⼀个临时的标识符。
该标识可以引⽤join、group和select⼦句的结果。
C#使用LINQ查询教程

C#使⽤LINQ查询教程21.1 LINQ查询概述LINQ可以对多种数据源和对象进⾏查询,如数据库、数据集、XML⽂档甚⾄是数组,这在传统的查询语句中是很难实现的。
如果有⼀个集合类型的值需要进⾏查询,则必须使⽤Where等⽅法进⾏遍历,⽽使⽤LINQ可以仿真SQL语句的形式进⾏查询,极⼤的降低了难度。
21.1.1 准备数据源既然LINQ可以查询多种数据源和对象,这些对象可能是数组,可能是数据集,也可能是数据库,那么在使⽤LINQ进⾏数据查询时⾸先需要准备数据源。
1.数组数组中的数据可以被LINQ查询语句查询,这样就省去了复杂的数组遍历。
数组数据源⽰例代码如下所⽰。
string[] str = { "学习", "学习LINQ", "好好学习", "⽣活很美好" };int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };数组可以看成是⼀个集合,虽然数组没有集合的⼀些特性,但是从另⼀个⾓度上来说可以看成是⼀个集合。
在传统的开发过程中,如果要筛选其中包含“学习”字段的某个字符串,则需要遍历整个数组。
2.SQL Server在数据库操作中,同样可以使⽤LINQ进⾏数据库查询。
LINQ以其优雅的语法和⾯向对象的思想能够⽅便的进⾏数据库操作,为了使⽤LINQ进⾏SQL Server数据库查询,可以创建两个表,这两个表的结构如下所⽰。
Student(学⽣表):S_ID:学⽣ID。
S_NAME:学⽣姓名。
S_CLASS:学⽣班级。
C_ID:所在班级的ID。
上述结构描述了⼀个学⽣表,可以使⽤SQL语句创建学⽣表,⽰例代码如下所⽰。
USE [student]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE TABLE [dbo].[Student]([S_ID] [int] IDENTITY(1,1) NOT NULL,[S_NAME] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,[S_CLASS] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,[C_ID] [int] NULL,CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED([S_ID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]为了更加详细的描述⼀个学⽣所有的基本信息,就需要创建另⼀个表对该学⽣所在的班级进⾏描述,班级表结构如下所⽰。
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 语句中循环访问查询变量时发生。
C#编程LINQ查询

C#编程LINQ查询LINQ查询表达式约束LINQ查询表达式必须以from⼦句开头,以select或group⼦句结束关键字from...in...:指定要查找的数据以及范围变量,多个from⼦句则表⽰从多个数据源查找数据。
注意:C#编译器会把"复合from⼦句"的查询表达式转换为SelectMany()扩展⽅法join...in...on...equals...:指定多个数据源的关联⽅式let:引⼊⽤于存储查询表达式中⼦表达式结果的范围变量,通常能达到层次感会更好,使代码更易于⽉的orderby、descending:指定元素的排序字段和排序⽅式,当有多个排序字段时,由字段顺序确定主次关系,可指定升序和降序两种排序⽅式where:指定元素的筛选条件,多个where⼦句则表⽰了并列条件,必须全部都满⾜才能⼊选,每个where⼦句可以使⽤&&、||连接多个条件表达式group:指定元素的分组字段select:指定查询要返回的⽬标数据,可以指定任何类型,甚⾄是匿名类型(⽬前通常被指定为匿名类型)into:提供⼀个临时的标识符,该标识符可以引⽤join、group和select⼦句的结果。
(1)直接出现在join⼦句之后的into关键字会被翻译为GroupJoin。
(2)select或group⼦句字后的into它会重新开始⼀个查询,让我们可以继续引⼊where、orderby和select⼦句,它是对分步构建查询表达式的⼀种简写⽅式。
下⾯通过⼀个案例来学习对两张表进⾏查询using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _013_LINQ {/// <summary>/// 武林⾼⼿/// </summary>class MartialArtsMaster {public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public string Menpai { get; set; }public string Kongfu { get; set; }public int Level { get; set; }public override string ToString(){return string.Format("Id: {0}, Name: {1}, Age: {2}, Menpai: {3}, Kongfu: {4}, Level: {5}", Id, Name, Age, Menpai, Kongfu, Level);}}}using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _013_LINQ {/// <summary>/// 武学/// </summary>class Kongfu {public int Id { get; set; }public string Name { get; set; }public int Power { get; set; }public override string ToString(){return string.Format("Id: {0}, Name: {1}, Power: {2}", Id, Name, Power);}}}using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;using System.Text;using System.Threading.Tasks;namespace _013_LINQ{internal class Program{private static void Main(string[] args){//初始化武林⾼⼿var masterList = new List<MartialArtsMaster>(){new MartialArtsMaster() {Id = 1, Name = "黄蓉", Age = 18, Menpai = "丐帮", Kongfu = "打狗棒法", Level = 9},new MartialArtsMaster() {Id = 2, Name = "洪七公", Age = 70, Menpai = "丐帮", Kongfu = "打狗棒法", Level = 10},new MartialArtsMaster() {Id = 3, Name = "郭靖", Age = 22, Menpai = "丐帮", Kongfu = "降龙⼗⼋掌", Level = 10},new MartialArtsMaster() {Id = 4, Name = "任我⾏", Age = 50, Menpai = "明教", Kongfu = "葵花宝典", Level = 1},new MartialArtsMaster() {Id = 5, Name = "东⽅不败", Age = 35, Menpai = "明教", Kongfu = "葵花宝典", Level = 10},new MartialArtsMaster() {Id = 6, Name = "林平之", Age = 23, Menpai = "华⼭", Kongfu = "葵花宝典", Level = 7},new MartialArtsMaster() {Id = 7, Name = "岳不群", Age = 50, Menpai = "华⼭", Kongfu = "葵花宝典", Level = 8},new MartialArtsMaster() {Id = 8, Name = "令狐冲", Age = 23, Menpai = "华⼭", Kongfu = "独孤九剑", Level = 10},new MartialArtsMaster() {Id = 9, Name = "梅超风", Age = 23, Menpai = "桃花岛", Kongfu = "九阴真经", Level = 8},new MartialArtsMaster() {Id = 10, Name = "黄药师", Age = 23, Menpai = "梅花岛", Kongfu = "弹指神通", Level = 10},new MartialArtsMaster() {Id = 11, Name = "风清扬", Age = 23, Menpai = "华⼭", Kongfu = "独孤九剑", Level = 10}};//初始化武学var kongfuList = new List<Kongfu>(){new Kongfu() {Id = 1, Name = "打狗棒法", Power = 90},new Kongfu() {Id = 2, Name = "降龙⼗⼋掌", Power = 95},new Kongfu() {Id = 3, Name = "葵花宝典", Power = 100},new Kongfu() {Id = 4, Name = "独孤九剑", Power = 100},new Kongfu() {Id = 5, Name = "九阴真经", Power = 100},new Kongfu() {Id = 6, Name = "弹指神通", Power = 100}};}上⾯定义了两个类,武林⾼⼿和武学,现在我们查询所有武学级别⼤于8且门派为丐帮的武林⾼⼿。
linq查询语句语法详解-Linq语法

Linq查询语法介绍2010Linq查询介绍 (1)LINQ查询 (1)LINQ查询select描述:查询顾客的公司名、地址信息查询句法:对应SQL:描述:查询职员的姓名和雇用年份查询句法:对应SQL:描述:查询顾客的ID以及联系信息(职位和联系人)查询句法:对应SQL:描述:查询订单号和订单是否超重的信息查询句法:对应SQL:where描述:查询顾客的国家、城市和订单数信息,要求国家是法国并且订单数大于5 查询句法:对应SQL:orderby描述:查询所有没有下属雇员的雇用年和名,按照雇用年倒序,按照名正序查询句法:对应SQL:分页描述:按照每页10条记录,查询第二页的顾客查询句法:对应SQL:分组描述:根据顾客的国家分组,查询顾客数大于5的国家名和顾客数查询句法:对应SQL:描述:根据国家和城市分组,查询顾客覆盖的国家和城市查询句法:对应SQL:描述:按照是否超重条件分组,分别查询订单数量查询句法:对应SQL:distinct描述:查询顾客覆盖的国家查询句法:对应SQL:union描述:查询城市是A打头和城市包含A的顾客并按照顾客名字排序查询句法:对应SQL:concat描述:查询城市是A打头和城市包含A的顾客并按照顾客名字排序,相同的顾客信息不会过滤查询句法:对应SQL:取相交项描述:查询城市是A打头的顾客和城市包含A的顾客的交集,并按照顾客名字排序查询句法:对应SQL:排除相交项描述:查询城市包含A的顾客并从中删除城市以A开头的顾客,并按照顾客名字排序查询句法:对应SQL:子查询描述:查询订单数超过5的顾客信息查询句法:对应SQL:in操作描述:查询指定城市中的客户查询句法:对应SQL:join描述:内连接,没有分类的产品查询不到查询句法:对应SQL:描述:外连接,没有分类的产品也能查询到查询句法:对应SQL:你可能会很奇怪,原先很复杂的SQL使用查询句法会很简单(比如按照条件分组)。
但是原先觉得很好理解的SQL使用查询句法会觉得很复杂(比如连接查询)。
C#10.LINQ的三种查询语句写法

C#10.LINQ的三种查询语句写法LINQ(语言集成查询)是C#编程语言中的一部分。
它在.NET Framework 3.5 和 C#3.0 被引入,在 System.Linq 命名空间中使用。
LINQ 为我们提供了通用的查询语法,该语法使我们能够查询来自各种数据源的数据。
这意味着我们可以从各种数据源(如 SQL Server 数据库,XML 文档, 数据集)以及任何其他内存中对象(如Collections,Generics 等)查询获取或更新设置数据。
编写 LINQ 查询,我们需要三个步骤:1、定义或引入数据源(内存中的对象,SQL,XML)2、编写询问语句3、在数据源中执行查询语句下面让我们来演示不同的 LINQ 查询语句写法简单的查询表达式:分别有:数据初始化、条件表达式、对象选取表达式组成from object in DataSourcewhere [condition]select object;设置查询条件:对象大于 5var QuerySyntax = from obj in integerList where obj > 5select obj;设置查询条件:对象大于 5using System;using System.Collections.Generic;using System.Linq;namespace Csharp{class Demo{static void Main(string[] args){// 数据源List<int> integerList = new List<int>(){1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// LINQ 方法1:查询表达式var QuerySyntax = from obj in integerList where obj > 5select obj;Console.WriteLine("LINQ 方法1:查询表达式");// 执行LINQ查询foreach (var item in QuerySyntax){Console.Write(item + " ");}Console.ReadKey();}}}输出大于 5 的对象:6 7 8 9 10DataSource.ConditionMethod([Condition]).SelectMethod();扩展数据源对象Where 查询方法var MethodSyntax = integerList.Where(obj => obj > 5).T oLi st();namespace Csharp{class Demo{static void Main(string[] args){// 数据源List<int> integerList = new List<int>(){1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// LINQ 方法2:对象表达式var MethodSyntax = integerList.Where(obj => obj > 5).T oLi st();Console.WriteLine("LINQ 方法2:对象表达式");// 执行LINQ查询foreach (var item in MethodSyntax){Console.Write(item + " ");}Console.ReadKey();}}输出大于 5 的对象:6 7 8 9 10两种查询语法也可以混合使用先使用查询语句表达式语法将数据筛选,然后通过对象方法表达式,返回数据之和var MethodSyntax = (from obj in integerListwhere obj > 5select obj).Sum();namespace Csharpclass Demo{static void Main(string[] args){// 数据源List<int> integerList = new List<int>(){1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// LINQ 方法3:2种语法混合使用var HybridMethod = (from obj in integerList where obj > 5select obj).Sum();Console.WriteLine("LINQ 方法3:2种语法混合使用"); // 执行LINQ查询Console.Write($"数据之和为:{HybridMethod}"); Console.ReadKey();}}}先筛选大于 5 的对象:6 7 8 9 10,再对这些对象求和输出:40今天我们给大家分享了,C#语言中LINQ查询的3种语法,大家都学会了吗?。
c#之linq——小白入门级

c#之linq——⼩⽩⼊门级通过本⽂需要掌握的关于linq的知识点为:linq的基本概念及其特点linq中常见操作及使⽤linq常见的⽅法查询1 Linq基本概念1.1 ling定义Linq(Language Integrated Query),语⾔集成查询,是⼀种使⽤类似SQL语句操作多种数据源的功能。
如,我们可以使⽤c#查询access数据库、.net数据集、xml⽂档以及实现了IEnumerable或IEnumerable<T>接⼝的集合类(如List,Array,SortedSet,Stack,Queue等,可以进⾏遍历的数据结构都会集成该类)。
从.net framework3.5中开始引⼊,能够提升程序数据处理能⼒和开发效率,具有集成性、统⼀性、可扩展性、抽象性、说明式编程、可组成型、可转换性等优势。
1.2 linq提供的程序Linq to Object。
提供程序查询内存中的集合和数组。
Linq to DataSet。
提供程序查询数据集中的数据。
Linq to SQL。
提供程序查询和修改Sql Server数据库中的数据,将应⽤程序中的对象模型映射到数据库表。
Linq to Entities。
使⽤linq to entities时,会在后台将linq语句转换为sql语句与数据库交互,并能提供数据变化追踪。
Linq to XML。
提供程序查询和修改XML,既能修改内存中的xml,也可以修改从⽂件中加载的。
2 Linq查询linq查询包括两种⽅式,⼀是语句查询,⼆是⽅法查询。
语句查询使⽤较多,也更容易理解,微软官⽹推荐使⽤。
下⾯介绍语句查询的⼦句使⽤。
2.1 from⼦句⽤来标识查询的数据源。
基本语法格式为:from 迭代变量 in 数据源⾸先,通过以下简单⽰例,给出from⽤法static void Main(string[] args){var nums = new int[] {56,97,98,57,74,86,31,90};var queryInfo = from num in nums select num;//num为数据中的每个元素(相当于foreach中迭代变量)var numStr = string.Empty;foreach (var item in queryInfo){numStr += item + " ";}Console.WriteLine($"数据元素包括:{numStr}");}运⾏结果如下图:注:查询表达式在循环访问查询变量时(如上述⽰例中foreach),才会执⾏。
LINQtoObjects系列(2)两种查询语法介绍

LINQtoObjects系列(2)两种查询语法介绍 LINQ为我们提供了两种查询语法,分别是查询表达式和查询⽅法语法。
这篇⽂章分为以下⼏个⽅⾯进⾏总结。
1,⼀个包含两种查询语法的简单⽰例2,查询表达式的结构3,查询⽅法相关的运算符⼀个LINQ查询既可以使⽤查询表达式实现,也可以⽤查询⽅法实现,还可以同时组合两种查询。
下⾯是⼀个简单的⽰例,代码如下。
namespace LINQDemo3{class Program{static void Main(string[] args){int[] numbers = { 2, 5, 28, 31, 17, 16, 42 };//查询表达式var query = from number in numberswhere number < 20select number;//查询⽅法(⼀般⽤lambda表达式)var numsMethod = numbers.Where(p => p < 20);//两种⽅式组合var numsCount = (from number in numberswhere number < 20select number).Count();foreach (var item in query){Console.WriteLine("{0}",item);}foreach (var item in numsMethod){Console.WriteLine("{0}",item);}Console.WriteLine(numsCount);Console.ReadKey();}}}查询表达式通常以from开头,以select结束,这跟SQL语句的顺序不太⼀样,C#这么做的原因之⼀是让VS智能感应能在我们输⼊代码时给我们更多选项。
⼀个查询表达式通常的结构如下图。
image查询⽅法主要分为过滤,排序,分组,统计,转换等⼏类操作,⽤⼀张图总结如下。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2012-9-25
LINQ是什么
LINQ( Language Integrated Query )即语言集成查询 LINQ 是一组语言特性和API,使得你可以使用统一的方式编 写各种查询。查询的对象包括XML、对象集合、SQL Server 数据库等等。 LINQ 主要包含以下三部分:
– – – LINQ to Objects 主要负责对象的查询 LINQ to XML 主要负责 XML 的查询 LINQ to 主要负责数据库的查询
参数列表
方法体
// 匿名方法方式 ProcessString p = delegate( string input ) { return input.ToLower(); 注意: 这里没有了具体 }; 的方法名称 因此称为 foreach (string name in foxRiver8) 匿名方法 { Console.WriteLine( p ( name ) ) ; }
22
Lambda表达式的简写方式
如果参数列表只包含一个推断类型参数时
(参数列表) => {方法体} 参数列表 => {方法体}
进行以下转换的前提是此处 x 的数据类型 可以根据上下文推断出来
(int x) => {return x+1;}
2012-9-25
x => {return x+1;}
23
Lambda表达式的简写方式
第二章
Linq介绍和查询表达式
课前回顾
请说出三条以上 C# 3.0 的新特性 请说出扩展方法定义的语法格式 使用 var 和 object 声明变量有什么区别?
2012-9-25
2
本章目标
掌握 LINQ 中的基本概念 掌握 LINQ 的组成 理解委托和匿名方法 理解 Lambda 表达式 掌握基本查询方法
(x, y) => { Console.WriteLine( x ); Console.WriteLine( y ); }
2012-9-25
多参数,推a与匿名方法的关系
总体上说,匿名方法可以看作是Lambda 表达式的功能子 集,但是两者存在以下区别: Lambda 表达式的参数允许不指明参数类型,而匿名方 法的参数必须明确指明参数类型 Lambda 表达式的方法体允许由单一表达式或者多条语 句组成,而匿名方法不允许单一表达式形式
2012-9-25
11
LINQ基本组件
LINQ to SQL组件,可以查询基于关系数据库(如SQL Server 数据库等)的数据,并对这些数据进行检索、插入、修改、删 除、排序、聚合、分区等操作。 LINQ to DataSet组件,可以查询DataSet对象中的数据,并对 这些数据进行检索、过滤、排序等操作。 LINQ to Objects组件,可以查询IEnumerable或 IEnumerable<T>集合,即能够查询任何可枚举的集合,如数 组(Array和ArrayList)、泛型列表List<T>、泛型字典 Dictionary<T>等,以及用户自定义的集合。 LINQ to XML组件,可以查询或操作XML结构的数据(如XML 文档、XML片段、XML格式的字符串等),并提供了修改文档 对象模型的内存文档和支持LINQ查询表达式等功能,以及处理 XML文档的全新的编程接口。
12
2012-9-25
查询表达式
查询表达式是LINQ中非常重要的一部分内容,它可 以从一个或多个给定的数据源中检索数据,并指定检 索结果的数据类型和表现形式。 查询表达式包含有8个子句,分别是from子句、where 子句、select子句、orderby子句、group子句、into子 句、join子句、let子句。查询表达式必须以from子句 开头,并且必须以select或groupby子句结束
<book> <title/> <author/> <year/> <price/> </book>
2012-9-25
Objects
Relational
XML
10
LINQ基本组件
LINQ是VS 2008和.NET Framework 3.5版中一项突破性 的创新,它在对象领域和数据领域之间架起了一座桥梁。 LINQ几乎可以查询或操作任何存储形式的数据。
如果方法体只包含一条语句时
(参数列表) => {方法体}
(参数列表) => 表达式
(int x) => {return x+1;}
(int x) => x+1
2012-9-25 24
Lambda表达式的更多例子
多参数,推断类型参数列 表,表达式方法体 (x, y) => x * y 无参数,表达式方法体 () => Console.WriteLine()
SQL 编码体验落后
– 没有智能感应 – 没有严格意义上的强类型和类型检查
SQL 和 XML 都有各自的查询语言,而对象没有自己的 查询语言
7
2012-9-25
LINQ 的历史
最初由 Anders Hejlsberg 构思,最初 的研究计划称为 Cω 2005年9月 – 第一个为 C# 2.0 开发 的技术预览版在当年的 PDC(微软开 发者大会)上发布 Anders Hejlsberg 2005年11月 – 更新至社区预览版(C# 2.0) 2006年1月 – 第一个为 VB 8.0 开发 的技术预览版发布 2007年11月19日 – LINQ作为 .NET Framework 3.5 的一部分正式发布
2012-9-25
26
基本查询操作符-获取数据(投影操作)
Select()
public static IEnumerable<TResult> Select<TSource, TResult> ( this IEnumerable<TSource> source, Func<TSource, TResult> selector )
???
2012-9-25
16
Lambda 表达式的进化
C# 3.0
Lambda 表达式
C# 2.0
匿名方法
C# 1.0
委托
2012-9-25
17
委托
委托的定义:
委托可以理解为一个函数指针,它定 义了一个函数的原型
delegate string ProcessString( string input ); 委托的实例化就是将委托变量指向 一个符合委托原型的实际方法 private string LowerIt (string input) { return input.ToLower(); }
说明 Select 方法本身是一个泛型扩展方法 它作用于IEnumerable<TSource>类型 它只接受一个 Func<TSource, TResult> 类型参数 Func<TSource, TResult> 是一个泛型委托,位于 System名字空间下,System.Core.dll中 27 2012-9-25 在这里 selector 是一个提取器
LowerIt() 方法
演示示例:委托的使用
18
本章小结
委托可以看作是托管版本的函数指针 委托只对方法的原型(签名)进行约束 委托可以方便我们在程序运行时动态决定对象的行 为
委托和接口有什么区别? 我们在以前的课程中学习过哪些接口或委托?
2012-9-25
19
匿名方法
在 C# 2.0 中,加入了匿名方法特性:
2012-9-25
13
LINQ 初体验
在没有LINQ以前,我们这样查询:
int[] numbers = new int[] { 6, 4, 3, 2, 9, 1, 7, 8, 5 }; List<int> even = new List<int>(); foreach (int number in numbers) { if (number % 2 == 0) { even.Add(number); } } even.Sort(); even.Reverse();
2012-9-25
从 numbers 数组中提取 偶数并降序排列
14
LINQ 初体验
今天,我们有了LINQ! 我们这样查询:
int[] numbers = 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);
– – – – Select() Where() OrderBy() GroupBy()
2012-9-25
3
本章任务
编写 LINQBasic 程序
– 使用Lambda表达式查询数组 – 使用委托和匿名方法操作字符串
2012-9-25
4
LINQ介绍
LINQ即Language Integrated Query,就是在语言中 加入了查询的语法。使用LINQ来操作数据将变得非 常的方便,因为它使用很多人都熟悉的、类似SQL的 语法来操作数据。LINQ是微软的一项新技术,也 是.NET Framework 3.5中最大的亮点。
1. LINQ to SQL 2. LINQ to DataSet 3. LINQ to Entities