LINQ入门
- 格式:wps
- 大小:312.55 KB
- 文档页数:54
第一章LINQ TO SQL 基础1. 什么是LINQ在C#3.0中提出了诸如Lambda表达式、查询语法等一系列新的特性,这些新的特性帮助我们将查询数据理解为一个类编程的理念。
我们称这个总的查询编程模型为“LINQ”--它指的是.NET 语言集合查询。
LINQ 支持这样一个非常广泛的的扩展模型:该模型是针对不同的数据源而生成不同的高效的操作因子。
.NET Framework 3.5版本内嵌了LINQ语言对对象,XML、实体、数据集和数据库的支持的词典,它所要解决的就是对象不等于数据的问题。
LINQ体系结构图如下:2. 什么是LINQ to SQL通过上图我们已经可以看到了,LINQ to SQL其实就是LINQ对于数据库的支持,它是O/RM(对象关系映射)在.NET Framework 3.5中的一种实现,它允许你用.NET 的类来生成一个关系型的数据库。
然后你可以用LINQ对从该对象中对数据库进行查询,更新/插入/删除。
LINQ to SQL完全支持事务,视图和存储过程。
它还提供了一种方便地在你的数据模型中对集合数据验证和业务逻辑规则的进行验证的方法。
在LINQ to SQL中,我们可以像下面的代码这样编写查询:Code1:在正式学习LINQ to SQL之前,我们需要先来熟悉一下C#3.0中的一些新特性,这些新的特性也是为了LINQ而产生的。
3. 隐含类型局部变量这是一个语言层面的功能,局部变量被声明为var,这个声明被视为隐含类型局部变量声明,然后由编译器根据局部变量初始化表达式来推断变量的类型。
如下面的声明:Code2:要注意的是var在这里是仅仅是一个关键字,它并不是C#3.0中的一种新的类型,而是负责告诉编译器,该变量需要根据初始化表达式来推断变量的类型,上面的语句相当于:在Code2中,变量integer仍然具有强类型,可以做如下测试:Code4:编译时会报Cannot implicitly convert type 'string' to 'int'错误。
跟我学LINQ TO SQL●LINQ是Language Integrated Query的简称,它是集成在.NET编程语言中的一种特性。
已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。
并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。
●LINQ定义了一组标准查询操作符用于在所有基于.NET平台的编程语言中更加直接地声明跨越、过滤和投射操作的统一方式,标准查询操作符允许查询作用于所有基于IEnumerable<T>接口的源,并且它还允许适合于目标域或技术的第三方特定域操作符来扩大标准查询操作符集,更重要的是,第三方操作符可以用它们自己的提供附加服务的实现来自由地替换标准查询操作符,根据LINQ模式的习俗,这些查询喜欢采用与标准查询操作符相同的语言集成和工具支持。
●LINQ架构●相关命名空间一.LINQ简介●LINQ包括五个部分:LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ toEntities、LINQ to XML。
●LINQ to SQL全称基于关系数据的.NET语言集成查询,用于以对象形式管理关系数据,并提供了丰富的查询功能。
其建立于公共语言类型系统中的基于SQL的模式定义的集成之上,当保持关系型模型表达能力和对底层存储的直接查询评测的性能时,这个集成在关系型数据之上提供强类型。
●LINQ to XML在System.Xml.LINQ命名空间下实现对XML的操作。
采用高效、易用、内存中的XML工具在宿主编程语言中提供XPath/XQuery功能等。
●第一步:建立dbml(Database Mark Language.数据库描述语言,是一种XML格式的文档,用来描述数据库,有点类似Nhibernate的映射文件)●第二步:创建一个页面,页面加入一个GridView控件●第三步:编写代码进行数据绑定●第四步:执行代码public partial class _Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){BindData();}}public void BindData(){NorthwindDataContext nt = new NorthwindDataContext();GridView1.DataSource = from c in nt.Customers select c.Orders;GridView1.DataBind();}}●LINQ是在之上的,那么在将来它会代替吗?●在大型项目中使用LINQ,它的效率如何呢?二.DataContenxt一、作用DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库。
Linq基础1.1 LINQ简介LINQ(Language Integrated Query)是C#3.0语言新增的一个扩展,可以处理非常大的对象集合,这一般需要选择集合的一个子集来完成执行程序的任务。
Linq提供了很多扩展方法便于集合的排序、组合和计算查询结果的统计数据。
VS2008带有3个内置的LIN Q变体:Linq to Objects Linq to SQL Linq to XML,它们为不同的数据提供了查询方案:Linq to Objects:为任意类型的C#内存对象提供查询,如数组、列表和其它集合类型。
Linq to SQL:为使用标准SQL数据库查询语言的关系数据库提供查询,如SQL Se rver、Oracle等数据库。
Linq to XML:提供XML文档的创建和处理功能。
1.2 第一LINQ查询下面我们使用Linq实现一个对数组的查找功能,代码如下:示例1class Program{static void Main(string[] args){string[] names = { "alonso", "zheng", "smith", "jon es", "smythe", "small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "singh" };var result = from n in names where n.StartsWith("s") select n;Console.WriteLine("以s开头的名字为:");foreach (var item in result){Console.WriteLine(item);}}}示例说明:命名空间:System.Linq;用var关键字声明结果变量;var声明的变量不用指定类型,编译器会自动根据结果推断出该类型。
Linq入门详解(Linq to Objects)再此之前,需要先了解的相关技术1.隐式类型、匿名类型、对象初始化器1)隐式类型,使用var关键字创建,C#编译器会根据用于初始化局部变量的初始值推断出变量的数据类型。
(不过我个人认为,能用具体类型的地方尽量不要用var关键字,因为这样会让你遗忘“被封装类库”方法的返回值类型--有损可读性)隐式类型使用限制:a)隐式类型只能应用于方法或者属性内局部变量的声明,不能使用var来定义返回值、参数的类型或类型的数据成员。
b)使用var进行声明的局部变量必须赋初始值,并且不能以null作为初始值。
2)匿名类型,只是一个继承了Object的、没有名称的类。
C#编译器会在编译时自动生成名称唯一的类。
3)对象初始化器,提供一种非常简洁的方式来创建对象和为对象的属性赋值。
(相关还有“集合初始化器”)由于C#强类型语言,即我们在声明变量时必须指定变量的具体类型。
所以在创建匿名对象时,需要结合隐式类型、匿名类型、对象初始化器一起创建匿名对象。
(避免类型转换)示例:var person = new { name = “heyuquan” , age = 24 }mbda表达式,Func委托1)Lambda表达式只是用更简单的方式来书写匿名方法,从而彻底简化.NET委托类型的使用。
Lambda表达式在C#中的写法是“arg-list => expr-body”,“=>”符号左边为表达式的参数列表,右边则是表达式体(body)。
参数列表可以包含0到多个参数,参数之间使用逗号分割。
2)Func委托Func委托,是微软为我们预定义的常用委托,封装一个具有:零个或多个指定类型的输入参数并返回一个指定类型的结果值的方法。
示例:static void Main(string[] args){// 委托函数Func<string, string, string> func1 = Hello;// 匿名方法Func<string, string, string> func2 =delegate(string a, string b){return "欢迎光临我的博客" + Environment.NewLine + a + " " + b;};// Lambda表达式Func<string, string, string> func3 =(a, b) => { return "欢迎光临我的博客" + Environment.NewLine + a + " " + b; };// 调用Func委托string helloStr = func2("滴答的雨", @"/heyuquan/");Console.WriteLine(helloStr);}static string Hello(string a, string b){return "欢迎光临我的博客" + Environment.NewLine + a + " " + b;}3.扩展方法1)扩展方法声明在静态类中,定义为一个静态方法,其第一个参数需要使用this关键字标识,指示它所扩展的类型。
跟我一起LINQ起来——之一(初识LINQ)1.什么是LINQ语言集成查询,提供适用于多种数据源(数据库、XML、内存对象)的通用查询。
2.如何创建LINQ项目1.必须.NET Framework3.5以上版本2.使用LINQ to XML必须添加对System.Xml.Linq 的引用3.使用LINQ to SQL必须添加对System.Data.Linq 的引用4.使用LINQ to Dataset必须为LINQ to DataSet 功能添加对System.Data.DataSetExtensions.dll 的引用3.使用LINQ 的优点1.熟悉的查询编写语法。
2.针对语法错误和类型安全的编译时检查。
3.改进的调试器支持。
4.IntelliSense 支持。
5.直接处理XML 元素的功能,而不是像W3C DOM 那样需要创建容器XML 文档。
6.强大的内存中XML 文档修改功能,比XPath 或XQuery 更容易使用。
7.强大的筛选、排序和分组功能。
8.用于跨多种数据源和数据格式处理数据的一致模型。
友情提示:以上所述有点需要在大量的程序中去体会。
本例中所有的案例代码均使用VS2008+SqlServer2005编写4.小试牛刀:基本查询案例1.查询普通int数组public static void IntQuery() {int[] array = new int[] { 1,2,3,4,5,6,7,8};//查询所有信息var arr = from n in array select n;foreach (var item in arr) {Console.WriteLine(item);}//查询所有偶数IEnumerable<int> arr1 = from n in array where n%2 == 0 select n;foreach (int item in arr1) {Console.WriteLine(item);}}案例2.查询string 数组案例3.查询 List<String> 集合//1.****查询普通字符串集合,类似于string 数组****public static void StringQuery() { //弱类型数组:.NET Framework 3.5新特性var countries = new string []{ "China","Americ","Canada","France"}; Console .WriteLine("*******查询China********"); var china = from country in countries where country == "China" select country; Console .WriteLine(china.First<string >()); Console .WriteLine("*******查询C 打头的元素********"); var likeC = from country in countries where country.StartsWith("C") select country; foreach (var item in likeC) { Console .WriteLine(item); } } public static void ListQuery() { List <string > countries = new List <string >(); countries.AddRange(new string [] { "China", "Americ", "Canada", "France" }); Console .WriteLine("*******查询C 打头的元素********"); var likeC = from country in countries where country.StartsWith("C") select country; //显示查询结果 foreach (var item in likeC) { Console .WriteLine(item); } }案例4.查询List<Student> 集合//////Student 实体类具有(Name、Age)属性///public static void ListQuery2() {List<Student> list = new List<Student>();list.AddRange(new Student[]{new Student("阿牛",23),new Student("阿猫",23),new Student("老朱",53)});Console.WriteLine("*******查询'啊'打头的Student信息********");IEnumerable<Student> stus = from stu in listwhere .StartsWith("阿")select stu;foreach (Student stu in stus) {Console.WriteLine(+"\t"+stu.Age);}}总结:通过以上四个案例,可以看出使用LINQ可以方便的从数组和List(也包括Dictionary)集合中查询得到想要的元素,可以大大的简化查找元素的过程。
LINQ中文教程一、LINQ概述LINQ是一种查询技术,它允许开发人员使用统一语法进行查询,无论是对于集合、数据库、XML还是其他数据源。
它支持对数据源进行过滤、排序、分组和投影等操作。
LINQ主要有以下几个方面的特点:1.统一的查询语法:LINQ提供了一种统一的查询语法,无论是对于集合还是其他数据源,开发人员都可以使用相同的语法进行查询。
2.编译时类型检查:LINQ的查询表达式是在编译时进行类型检查的,这样可以在编译时就发现错误,提高了代码的健壮性。
3.延迟加载:LINQ的查询通常支持延迟加载,只有在需要结果时才会执行查询操作,这样可以提高性能和效率。
4.集成查询:通过LINQ,可以对多个数据源进行集成查询,无论是集合、数据库还是XML等,都可以使用相同的查询语法进行查询和操作。
5.可组合性:LINQ的查询操作可以进行组合,可以将多个查询操作串联起来,形成复杂的查询链。
二、LINQ的用法1.查询语法LINQ提供了一种类似于SQL的查询语法,通过关键字from、where、select等来描述查询过程。
例如,对于一个整数集合,可以使用如下的查询语法来查询大于10的数字:```var query = from num in numberswhere num > 10select num;```其中,numbers是一个整数集合,num是每个元素的别名,select num表示选择满足条件的元素。
2.方法语法除了查询语法,LINQ还提供了一种方法语法,通过调用特定的查询方法来实现查询。
例如,对于上述的查询,可以使用方法语法来实现:```var query = numbers.Where(num => num > 10);```其中,Where是一个查询方法,num => num > 10表示一个Lambda表达式,表示筛选大于10的数字。
3.查询结果的使用通过LINQ的查询语法或方法语法,可以得到一个查询结果,可以将其转换为各种类型,进行进一步的操作。
C#⾼级篇——初识LINQ前⾔提醒:为了能够将知识点学得更加透彻、记得更加牢固我会通过教学讲解的⽅式把知识写下来因为在过程中会让⼈从学⽣变成⽼师这个过程会挖掘出新的知识和观点是⼀个⾃我思维切换⽽达成的知识深度挖掘和提升的过程如果能帮助到⼤家那就最好如果有讲错的地⽅还请多多指教!我只是⼀只菜鸡感谢理解!1、初识LINQ相信⼤家多多少少都在⽹上或者书⾥看到过LINQ这玩意,那它到底是个什么玩意呢?今天就和⼤家⼀起来学习下LINQLINQ是集成到C#和VB .NET这些语⾔中⽤于提供查询数据能⼒的⼀个新特征在关系型数据库中,数据被组织放⼊规范性很好的表中,并且通过简单⽽⼜强⼤的语⾔SQL来进⾏访问,然⽽程序中却与数据库相反,保存在类对象或结构中的数据差异很⼤,因此没有通⽤的查询语句来从数据结构中获取数据,⾃C#3.0引⼊LINQ后,我们便有了查询对象数据的能⼒就是说LINQ是C#提供给了我们开发者⼀个快速查询数据的能⼒LINQ-----------让语⾔更优美,让查询更便捷,让代码更出⾊。
2、简单的LINQ案例先来⼀个⽰例,让⼤伙看看LINQ的魅⼒所在要使⽤LINQ的话就要引⽤它所在的命名空间 using System.Linq;using System;using System.Collections.Generic;using System.Linq;namespace ConsoleApp1{class GameText{public int gameID; //游戏IDpublic string gameName; //游戏名称public string gameIntduced; //游戏介绍public int gameSize; //游戏⼤⼩}class Program{static List<GameText> game = new List<GameText>(){new GameText(){gameID = 1,gameName = "东凑西凑",gameIntduced = "这是⼀个2D实习⾯试项⽬",gameSize = 1},new GameText(){gameID = 2,gameName = "同桌的你",gameIntduced = "这是⼀个青春校园题材的游戏",gameSize = 5},};static void Main(string[] args){var res = from m in gamewhere m.gameID > 1select m.gameName;foreach (var item in res){Console.WriteLine(item);}}}}主要看这个地⽅var res = from m in gamewhere m.gameID > 1select m.gameName;from in 都是关键字 game是我们要查询的数据的对象 m表⽰game⾥⾯的元素where 是⽤来做条件限制的这⾥我写了⼀个m.gameID > 1的条件意思就是查询game集合中的gameID⼤于1的元素select m.gameName 查出满⾜条件的游戏并返回它的游戏名称我们来看下输出结果东凑西凑游戏ID为1 同座的你ID为2where m.gameID > 1显然是同座的你这款游戏符合条件所以最后我们得到的是同座的你这款游戏看吧是不是很简单,⾃⼰动⼿敲⼀下马上就能理解了!3、关于LINQ的不同语法刚刚的案例讲的是LINQ表达式的写法也称(查询语法),这⾥我们还可以使⽤⽅法语法来进⾏数据查询查询语法(query syntax)是声明形式的,看上去和SQL语句很相似。
目前本人收集的最全的LINQ入门资料大家一起LINQ吧入门教程系列1LinqtoSql(一):DataConte某t与实体LinqtoSql(二):增删改LinqtoSql(三):查询句法LinqtoSql(四):存储过程LinqtoSql(五):探究特性LinqtoSql(六):并发与事务LinqtoSql(七):继承与关系Linqtoql(八):其它入门教程系列2LINQ体验(1)——ViualStudio2022新特性我平时利用课余零碎时间来学习3.5、LINQ、Silverlight、3.5E某tenion等新东西,通过笔记形式来记录自己所学的历程,也给大家一起学习ViualStudio2022和.NET3.5提供一个平台,为保证此系列的完整性,我打算先依次介绍一下C#3.0新语言特性和改进,然后从一条一条LINQ语句分析来贯穿LINQ的知识点……LINQ体验(2)——C#3.0新语言特性和改进(上篇)LINQ体验(3)——C#3.0新语言特性和改进(下篇)LINQ体验(4)——LINQ简介和LINQtoSQL语句之WhereLINQ是LanguageIntegratedQuery的简称,它是集成在.NET编程语言中的一种特性。
已成为编程语言的一个组成部分,在编写程序时可以得到很好的编译时语法检查,丰富的元数据,智能感知、静态类型等强类型语言的好处。
并且它同时还使得查询可以方便地对内存中的信息进行查询而不仅仅只是外部数据源。
…LINQ体验(5)——LINQtoSQL语句之Select/Ditinct和Count/Sum/Min/Ma某/AvgLINQ体验(6)——LINQtoSQL语句之Join和OrderByLINQ体验(7)——LINQtoSQL语句之GroupBy/Having和E某it/In/Any/All/Contain我们继续讲解LINQtoSQL语句,这篇我们来讨论GroupBy/Having操作符和E某it/In/Any/All/Contain操作符。
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),才会执⾏。
1. LINQ的读法:(1)lin k (2)lin q2. LINQ的关键词:from, select, in, where, group by, order by …3. LINQ的注意点:必须以select或者是group by 结束。
4. LINQ的语义:from 临时变量 in 集合对象或数据库对象where 条件表达式[order by条件]select 临时变量中被查询的值[group by 条件]LINQ的查询返回值的类型是临时变量的类型,可能是一个对象也可能是一个集合。
并且LINQ的查询表达式是在最近一次创建对象时才被编译的。
LINQ的查询一般跟var关键字一起联用 (什么是var?匿名对象) 。
以下的两个查询表达式是一样的效果:var q = from name in methodswhere (.Length > 15)select name;5. LINQ的全称:Language-Integrated Query6. LINQ的分类:LINQ to Object, LINQ to XML, LINQ to SQL, LINQ to Q:为何LINQ 查询语法是以from 关键字开头的,而不是以select 关键字开头的?select 开头这种写法跟SQL的写法更接近,更易懂呀?A:简单来说,为了IDE的智能感知(Intelisence)这个功能,select 关键字放在后面了。
假设你要书写这样的代码:Select , p.Age From p In persons Where xxx ,代码是一个个字符输入的。
我们在写到p in persons 之前,p 的类型是无法推测的,所以写Select p. 的时候,Name之类的属性不会弹出智能提示来。
这样就需要先去写From 这句,再回来写Select。
微软IDE组经过反复考虑决定,还不如就把Select 写到后面了。
于是编程语言中的写法就确定这样来写了。
第一讲 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支持大量的查询操作符——可用于选择、排序或筛选从查询返回的数据的关键字。
尽管本章所有示例是在LINQ to SQL的背景下讨论的,但也可将它们应用到其他LINQ实现中。
接下来,将通过示例概述一些最为重要的标准查询操作符。
每个示例都使用对象模型和之前创建的名为myDataContext的DataContext对象作为查询的数据源。
1. SelectSelect关键字(C#中是select)用于从查询的源中检索对象。
在这个示例中,可看到如何选择已有类型的一个对象。
在本章后面,将看到如何动态定义新的对象类型。
C#var allReviews = from r in myDataContext.Reviewsselect r;这一示例中的变量指范围变量(range variable),它只在当前查询中可用。
通常在From子句中引入范围变量,然后在Where 和Select子句再次使用它来筛选数据,表明要选择的数据。
尽管对于它可采用任意的名称,通常看到的是单个字母的变量,如r(表示Review)或所查询集合的单数形式(在前面的示例中是review而不是r)。
2. From尽管From子句(C#中是from)不能算是标准查询运算符,因为它并不对数据进行操作而是指向数据,但它是LINQ查询中的一个重要元素,因为它定义了查询所执行的集合或数据源。
在前面的例子中,From子句表明查询必须对myDataContext 对象所提供的Reviews集合进行执行。
3. Order By运用Order By(C#中的orderby),可以对结果集合中的项进行排序。
Order By后面紧跟着的是可选的用来指定排序顺序的Ascending或Descending关键字(C#中是ascending或descending)。
可以通过逗号分隔来指定多个条件。
下列查询返回一个流派列表,首先按SortOrder列以降序排列,然后按Name列以升序排列。
Linq基础学习目录1LINQ查询结果集12System.Array 数组12.1基于System.Array定义数组12.2基于类型定义数组12.3数组元素的清空12.4System.Array类静态成员12.5不用循环填充数组12.6数组类实例成员23System.Collections 集合23.1ArrayList 23.1.1实例成员23.1.2静态成员23.2List<T> 33.3Hashtable 63.4SortedList 63.5SortedList<TKey,TValue> 73.6Queue<T> 83.7Stack<T> 83.8LinkedList<T> 83.9HashSet<T> 94System.Linq 104.1System.Linq.Enumerable 104.2System.Linq.Queryable 104.3System.Linq.Lookup <TKey,TElement> 104.4System.Linq.Expressions.Expression 105接口105.1IEnumerable 、IEnumerator 105.1.1正常使用105.1.2C#的yield 125.2IEnumerable <T> 125.3IEnumerator <T> 125.4ICollection 125.5ICollection <T> 135.6IList 135.7IList <T> 135.8IEqualityComparer 135.9IEqualityComparer <T> 135.10IDictionary 135.11IDictionary <TKey,TValue> 135.12IDictionaryEnumerator 135.13IComparer 135.13.1接口方法说明int Compare(object x, object y) 13 5.13.2ArrayList.Sort (IComparer) 方法135.14IComparer <T> 145.14.1接口方法override int Compare(T x, T y)说明14 5.14.2List.Sort (IComparer) 方法145.15System.Linq.IGrouping<T> 145.16System.Linq.ILookup<TKey,TElement> 145.17System.Linq.IOrderedEnumerable<T> 145.18System.Linq.IOrderedQueryable 145.19System.Linq.IOrderedQueryable<T> 155.20System.Linq.IQueryable 155.21System.Linq.IQueryable<T> 155.22System.Linq.IQueryProvider 156集合扩展方法156.1集合扩展方法的实现:一个Where的例子156.2延迟类156.2.1Select 选择166.2.2SelectMany 选择166.2.3Where 条件166.2.4OrderBy 排序升176.2.5OrderByDescending 排序降176.2.6GroupBy 分组176.2.7Join 联合查询186.2.8GroupJoin 186.2.9Take 获取集合的前n个元素196.2.10Skip 跳过集合的前n个元素196.2.11Distinct 过滤集合中的相同项196.2.12Union 连接不同集合,自动过滤相同项196.2.13Concat 连接不同集合,不会自动过滤相同项196.2.14Intersect 获取不同集合的相同项(交集)206.2.15Except 从某集合中删除其与另一个集合中相同的项20 6.2.16Reverse 反转集合206.2.17TakeWhile 条件第一次不成立就跳出循环206.2.18SkipWhile 条件第一次不成立就失效,将后面的数据全取206.2.19Cast 将集合转换为强类型集合216.2.20OfType 过滤集合中的指定类型216.3不延迟(浅复本) 216.3.1Single 集合中符合条件的唯一元素,浅复本216.3.2SingleOrDefault 集合中符合条件的唯一元素(没有则返回类型默认值),浅复本21 6.3.3First 集合的第一个元素,浅复本216.3.4FirstOrDefault 集合中的第一个元素(没有则返回类型默认值),浅复本226.3.5Last 集合中的最后一个元素,浅复本226.3.6LastOrDefault 集合中的最后一个元素(没有则返回类型默认值),浅复本226.3.7ElementAt 集合中指定索引的元素,浅复本226.3.8ElementAtOrDefault 集合中指定索引的元素(没有则返回类型默认值),浅复本22 6.3.9Contains 判断集合中是否包含有某一元素226.3.10Any 判断集合中是否有元素满足某一条件226.3.11All 判断集合中是否所有元素都满足某一条件236.3.12SequenceEqual 判断两个集合内容是否相同236.3.13Count 、LongCount集合中的元素个数236.3.14Average 、Sum集合平均值求和236.3.15Max、Min 集合最大值,最小值246.3.16Aggregate 根据输入的表达式获取一个聚合值246.3.17DefaultIfEmpty 查询结果为空则返回默认值,浅复本246.3.18ToArray 将集合转换为数组,浅复本246.3.19ToList 将集合转换为List<T>集合,浅复本256.3.20ToDictionary 将集合转换为<K, V>集合,浅复本257Lambda表达式257.1例1(比效) 257.2例2(多参) 277.3例3(list.Where)277.4Lambda表达式中Lifting 288QuerySyntax 查询语法298.1from in select 308.2orderby 排序308.3group by into 分组318.4join in on equals 联合查询338.5into 汇总339DataSource 数据绑定34LINQ查询结果集System.Array 数组所有数组都继承于System.Array,数组可以用System.Array建立数组可以是一维也可以是多维数组。
1 语言集成查询(LINQ) 是V isual Studio 2008 中的一组功能,可为C# 和V isual Basic 语言语法提供强大的查询功能。
LINQ 引入了标准的、易于学习的查询和更新数据模式,可以对其技术进行扩展以支持几乎任何类型的数据存储。
Visual Studio 2008 包含LINQ 提供程序的程序集,这些程序集支持将LINQ 与.NET Framework 集合、SQL Server 数据库、 数据集和XML 文档一起使用。
2 查询是一种从数据源检索数据的表达式。
查询通常用专门的查询语言来表示。
随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的SQL 和用于XML 的XQuery。
因此,开发人员不得不针对他们必须支持的每种数据源或数据格式而学习新的查询语言。
LINQ 通过提供一种跨各种数据源和数据格式使用数据的一致模型,简化了这一情况。
在LINQ 查询中,始终会用到对象。
可以使用相同的基本编码模式来查询和转换XML 文档、SQL 数据库、 数据集、.NET 集合中的数据以及对其有LINQ 提供程序可用的任何其他格式的数据。
3 所有LINQ 查询操作都由以下三个不同的操作组成:获取数据源。
创建查询。
执行查询。
4 数据源可查询类型不需要进行修改或特殊处理就可以用作LINQ 数据源。
如果源数据还没有作为可查询类型出现在内存中,则LINQ 提供程序必须以此方式表示源数据。
例如,LINQ to XML 将XML 文档加载到可查询的XElement 类型中:XElement contacts = XElement.Load(@"c:\myContactList.xml");使用IEnumerable 或IEnumerable<(Of <(T>)>)。
支持IEnumerable<(Of <(T>)>) 或派生接口(如泛型IQueryable<(Of <(T>)>))的类型称为“可查询类型”。
在LINQ to SQL 中,首先手动或使用对象关系设计器(O/R 设计器)在设计时创建对象关系映射。
针对这些对象编写查询,然后由LINQ to SQL 在运行时处理与数据库的通信。
5 集成查询语言集成查询(LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到C# 语言(以及V isual Basic 和可能的任何其他.NET 语言)的基础上。
借助于LINQ,查询现在已是高级语言构造,就如同类、方法、事件等等。
对于编写查询的开发人员来说,LINQ 最明显的“语言集成”部分是查询表达式。
查询表达式是使用C# 3.0 中引入的声明性查询语法编写的。
通过使用查询语法,您甚至可以使用最少的代码对数据源执行复杂的筛选、排序和分组操作。
您使用相同的基本查询表达式模式来查询和转换SQL 数据库、 数据集、XML 文档和流以及.NET 集合中的数据。
6关键字from 指定数据源和范围变量(类似于迭代变量)。
where 根据一个或多个由逻辑“与”和逻辑“或”运算符(&& 或||)分隔的布尔表达式筛选源元素。
select 指定当执行查询时返回的序列中的元素将具有的类型和形式。
group 按照指定的键值对查询结果进行分组。
into 提供一个标识符,它可以充当对join、group 或select 子句的结果的引用。
orderby 基于元素类型的默认比较器按升序或降序对查询结果进行排序。
join 基于两个指定匹配条件之间的相等比较来联接两个数据源。
let 引入一个用于存储查询表达式中的子表达式结果的范围变量。
in join 子句中的上下文关键字。
on join 子句中的上下文关键字。
equals join 子句中的上下文关键字。
by group 子句中的上下文关键字。
ascending orderby 子句中的上下文关键字。
descending orderby 子句中的上下文关键字。
7表达式查询表达式可用于查询和转换来自任意支持LINQ 的数据源中的数据。
例如,单个查询可以从SQL 数据库检索数据,并生成XML 流作为输出。
查询表达式容易掌握,因为它们使用许多常见的C# 语言构造。
有关更多信息,请参见C# 中的LINQ 入门。
查询表达式中的变量都是强类型的,但许多情况下您不需要显式提供类型,因为编译器可以推断类型。
有关更多信息,请参见查询操作中的类型关系(LINQ)。
在您循环访问foreach 语句中的查询变量之前,不会执行查询。
有关更多信息,请参见LINQ 查询介绍。
在编译时,根据C# 规范中设置的规则将查询表达式转换为“标准查询运算符”方法调用。
任何可以使用查询语法表示的查询也可以使用方法语法表示。
但是,在大多数情况下,查询语法更易读和简洁。
有关更多信息,请参见C# 语言规范和标准查询运算符概述。
作为编写LINQ 查询的一项规则,建议尽量使用查询语法,只在必需的情况下才使用方法语法。
这两种不同形式在语义或性能上没有区别。
查询表达式通常比用方法语法编写的等效表达式更易读。
一些查询操作,如Count 或Max,没有等效的查询表达式子句,因此必须表示为方法调用。
方法语法可以通过多种方式与查询语法组合。
有关更多信息,请参见查询语法与方法语法(LINQ)。
查询表达式可以编译为表达式目录树或委托,具体取决于查询所应用到的类型。
IEnumerable<(Of <(T>)>) 查询编译为委托。
IQueryable 和IQueryable<(Of <(T>)>) 查询编译为表达式目录树。
有关更多信息,请参见表达式目录树。
8查询语法与方法语法通过使用C# 3.0 中引入的声明性查询语法,介绍性LINQ 文档中的多数查询都被编写为查询表达式。
但是,.NET 公共语言运行库(CLR) 本身并不具有查询语法的概念。
因此,在编译时,查询表达式会转换为CLR 确实了解的内容:方法调用。
这些方法称为“标准查询运算符”,它们具有如下名称:Where、Select、GroupBy、Join、Max、Average等。
可以通过使用方法语法而非查询语法直接调用这些方法。
通常我们建议使用查询语法,因为它通常更简单、更易读;但是方法语法和查询语法之间并无语义上的区别。
此外,一些查询(如检索匹配指定条件的元素数的那些查询或检索具有源序列中的最大值的元素的查询)只能表示为方法调用。
System.Linq 命名空间中的标准查询运算符的参考文档通常使用方法语法。
因此,即使在开始编写LINQ 查询时,熟悉如何在查询和查询表达式本身中使用方法语法也非常有用。
//Query syntax:IEnumerable<int> numQuery1 =from num in numberswhere num % 2 == 0orderby numselect num;//Method syntax:IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);这些标准查询运算符作为一种新的方法(称为“扩展方法”)实现。
扩展方法可“扩展”现有类型;可如对类型的实例方法一样调用。
标准查询运算符可扩展IEnumerable<(Of <(T>)>),这就是您可以编写numbers.Where(...) 的原因。
在上面的代码示例中,OrderBy方法并非是在对Where的调用时使用点运算符调用的。
Where可生成筛选序列,然后Orderby通过对其排序来对该序列进行运算。
因为查询会返回IEnumerable,所以您可通过将方法调用链接在一起,在方法语法中将这些查询组合起来。
这就是在您通过使用查询语法编写查询时编译器在后台所执行的操作。
并且由于查询变量不存储查询的结果,因此您可以随时修改它或将它用作新查询的基础,即使在执行它后。
X标准查询运算符“标准查询运算符”是组成语言集成查询(LINQ) 模式的方法。
大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<(Of <(T>)>) 接口或IQueryable<(Of <(T>)>) 接口。
标准查询运算符提供了包括筛选、投影、聚合、排序等功能在内的查询功能。
共有两组LINQ 标准查询运算符,一组在类型为IEnumerable<(Of <(T>)>) 的对象上运行,另一组在类型为IQueryable<(Of <(T>)>) 的对象上运行。
构成每组运算符的方法分别是Enumerable 和Queryable 类的静态成员。
这些方法被定义为作为方法运行目标的类型的“扩展方法”。
这意味着可以使用静态方法语法或实例方法语法来调用它们。
此外,许多标准查询运算符方法运行所针对的类型不是基于IEnumerable<(Of <(T>)>) 或IQueryable<(Of <(T>)>) 的类型。
Enumerable 类型定义两个此类方法,这些方法都在类型为IEnumerable 的对象上运行。
利用这些方法(Cast<(Of <(TResult>)>)(IEnumerable) 和OfType<(Of <(TResult>)>)(IEnumerable)),您将能够在LINQ 模式中查询非参数化或非泛型集合。
这些方法通过创建一个强类型的对象集合来实现这一点。
Queryable 类定义两个类似的方法(Cast<(Of <(TResult>)>)(IQueryable) 和OfType<(Of <(TResult>)>)(IQueryable)),这些方法在类型为Queryable 的对象上运行。
各个标准查询运算符在执行时间上有所不同,具体情况取决于它们是返回单一值还是值序列。
返回单一值的方法(例如A verage 和Sum)会立即执行。
返回序列的方法会延迟查询执行,并返回一个可枚举的对象。
对于在内存中集合上运行的方法(即扩展IEnumerable<(Of <(T>)>) 的那些方法),返回的可枚举对象将捕获传递到方法的参数。
在枚举该对象时,将使用查询运算符的逻辑,并返回查询结果。