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操作符。
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>)>) 的那些方法),返回的可枚举对象将捕获传递到方法的参数。
在枚举该对象时,将使用查询运算符的逻辑,并返回查询结果。