基本概念
从技术角度而言,LINQ定义了大约40个
查询操作符,如select、from、in、where以及orderby(C#)中。试用这些操作可以编写
查询语句。不过,这些
查询还可以基于很多类型的数据,每个数据类型都需要一个单独的LINQ类型。 经过了最近 20 年,面向对象编程技术( object-oriented (OO) programming technologies )在工业领域的应用已经进入了一个稳定的发展阶段。程序员现在都已经认同像 类(classes)、对象(objects)、
方法(methods)这样的语言特性。考察现在和下一代的技术,一个新的编程技术的重大挑战开始呈现出来,即面向对象技术诞生以来并没有
解决降低访问和整合信息数据( accessing and integrating information )的复杂度的问题。其中两个最主要访问的数据源与
数据库( database )和 XML 相关。 LINQ 提供了一条更常规的途径即给 .Net Framework
添加一些可以应用于所有信息源( all sources of information )的具有多种用途( general-purpose )的语法
查询特性( query facilities ),这是比向开发语言和运行时( runtime )
添加一些关系数据( relational )特性或者类似 XML 特性( XML-specific )更好的方式。这些语法特性就叫做 .NET Language Integrated Query (LINQ) 。 包含 DLinq 和 XLinq
基础知识
1. LINQ的读法:(1)lin k (2)lin q 2. 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?匿名对象) 。 5. LINQ的全称:Language-Integrated Query 6. LINQ的
分类:LINQ to Object,LINQ to XML,LINQ to
sql,LINQ to
ADO.NET
语法实例
C#3.0 LINQ
查询语法 首先来看一个很简单的LINQ
查询例子,
查询一个int 数组中小于5的数字,并按照大小顺序排列: class Program { static void Main(string[] args) { int[] arr = new int[] { 8,5,89,3,56,4,1,58 }; var m = from n in arr where n < 5 orderby n select n; foreach (var n in m) { Console.WriteLine(n); } Console.ReadLine(); } } 上述
代码除了LINQ
查询语法外,其他都是我们所熟悉的语法,而LINQ
查询语法跟
SQL查询语法很相似,除了先后顺序。 Q:为何 LINQ
查询语法是以 from 关键字开头的,而不是以 select 关键字开头的?select 开头这种写法跟
sql的写法更接近,更易懂呀? A:简单来说,为了IDE的智能感知(Intelisence)这个
功能,select 关键字放在后面了。 编程语言以 select 开头写LINQ
查询语法不是没出现过,你如果使用过2005年的VB9 CTP 版本,那时候VB9的LINQ
查询语法就是 select 关键字在前面,但是 select 关键字在前面,在做智能感知(Intelisence)时候就很头大。经过微软IDE组的权衡,确定了把 from 关键字放在最前面。 那时候 VB9 LINQ的
查询语法还是 select 参数在最前面。不过后来 VB9 测试版改成了跟 C# 一样的做法, from 关键字放在最前面了。 更详细的解释,来自装配脑袋 假设你要书写这样的
代码:Select p.Name,p.Age From p In persons Where xxx ,
代码是一个个字符输入的。 我们在写到 p in persons 之前,p 的类型是无法推测的,所以写 Select p. 的时候,Name之类的
属性不会弹出智能
提示来。 这样就需要先去写 From 这句,再回来写 Select。 微软IDE组经过反复考虑决定,还不如就把 Select 写到后面了。于是编程语言中的写法就确定这样来写了。 VB9 的这个变化可以参看这篇
博客: Select/From vs. From/Select revisited... 我们再来看一个稍稍复杂的LINQ
查询: 在我们罗列的语言字符串中,我们希望按照字符长短,
分类罗列出来,实现
代码如下: static void Main(string[] args) { string [] languages = {"Java","C#","C++","Delphi","VB.net","VC.net","C++ Builder","Kylix","Perl","Python"}; var query = from item in languages orderby item group item by item.Length into lengthGroups orderby lengthGroups.Key descending select lengthGroups; foreach (var item in query) { Console.WriteLine("strings of length {0}",item.Key); foreach (var val in item) { Console.WriteLine(val); } } Console.ReadLine(); } 其中的 into 关键字表示 将前一个
查询的结果视为后续
查询的
生成器,这里是跟 group by 一起使用的。 LINQ中的Group by不要跟
sql 中的Group by 混淆,
sql 由于是二维结构,Group by 的一些逻辑受二维结构的约束,无法像 LINQ 中的Group by 这么灵活。
Linq的内部执行原理浅析
LINQ(Language Integrated Query)是Visual Stu
dio 2008中的领军人物。借助于LINQ技术,我们可以使用一种类似
sql的语法来
查询任何形式的数据。目前为止LINQ所
支持的数据源有
sql Server、XML以及内存中的数据集合。开发人员也可以使用其提供的扩展框架
添加更多的数据源,例如
MysqL、Amazon甚至是Google Desktop。 一般来讲,这类
查询语句的一个重要特点就是可以并行化执行。虽然有些情况下并行可能会带来一些问题,但这种情况非常少见。这样也就水到渠成地引出了PLINQ这个并行处理的LINQ类库。 PLINQ原名为Parallel LINQ,
支持XML和内存中的数据集合。执行于远程服务器上的
查询语句(例如LINQ to
sql)显然无法实现这个
功能。 将LINQ语句转换为PLINQ语句极为简单——只需要在
查询语句中From子句所指定的数据源的最后
添加.AsParallel()即可。随后Where、OrderBy和Select子句将
自动改为
调用这个并行的LINQ版本。 据MSDN Magazine介绍,PLINQ可以以三种方式执行。第一种是管道处理:一个线程用来读取数据源,而其他的线程则用来处理
查询语句,二者同步进行——虽然这个单一的消费线程可能并不那么容易与多个生产线程同步。不过若是能够仔细配置好
负载平衡的话,仍然会极大地减少内存占用。 第二种模式叫做“stop and go”,用于处理结果集需要被一次返回时(例如
调用ToList、ToArray或对结果排序)的情况。在这种模式下,将依次完成各个处理过程,并将结果统一返回给消费线程。这个模式在
性能上将优于第一种模式,因为它省去了用来保持线程同步所花费的开销。 最后一种
方法叫做“inverted enumeration”。该
方法并不需要实现收集到所有的
输出,然后在单一的线程中处理,而是将最终
调用的
函数通过ForAll扩展传递到每个线程中。这是目前为止最快的一种处理模式,不过这需要传递到ForAll中的
函数是线程安全的,且最好不包含任何lock之类的互斥语句。 若是PLINQ中任意的一个线程抛出异常,那么所有的其他线程将会被终止。若是抛出了多个异常,那么这些异常将被组合成一个MultipleFailuresException类型的异常,但每个异常的
调用堆栈仍会被保留。
关于LINQ的技巧从大的方面来看它能给开发团队带来的好处: 1、无需复杂学习过程即可上手 2、编写更少
代码即可创建完整应用。 3、更快开发
错误更少的应用程序。 4、无需求助奇怪的编程技巧就可合并数据源。 5、让新开发者开发效率更高。