LINQ,语言集成查询(Language Integrated Query)是一组用于C#和Visual Basic语言的扩展。
它允许编写C#或Visual Basic代码以查询数据库相同的方法操作内存数据。
它在.Net Framework的System.Linq。命名空间。
它是在.NET Framework 3.5 出现的技术,所以在创建新项目的时候必须要选3.5或者更高的版本。
否则无法使用,在更高的版本创建项目时会自动包含System.Linq的命名空间。
LINQ语法和SQL语法非常相似,除了先后顺序。
LINQ以from开头的原因是为了IDE的智能感知。在2005年的VB9 CTP版本中,那时候的LINQ查询语法就
select关键字在前面的,但是select关键字在前面,在智能感知(Intelisence)时候就很头大。经过微软IDE
组的权衡,确定把from关键字放在最前面。
更详细的解释,
假设你要书写这样的代码:Select p.Name,p.Age From p In persons where xxx 代码是一个个字符输入的。
我们在写到p in persons 之前,p的类型是无法推测的,所以写Select p. 的时候,Name之类的属性不会弹出智能提示来。
这样就需要先去写From这句,再回来写Select。
LINQ是Visual Studio 2008中的领军人物,借助于LINQ技术,我们可以使用一直类似SQL的语法来查询任何形式的数据。
一般来说,这类查询语法的一个重要特点就是可以并行化执行。虽然有些情况下并行可能会带来一些问题,但这种情况非常少见。
这样也就水到渠成地引出了PLINQ这个并行处理的LINQ类库。
PLINQ原名是Parallel LINQ,支持XML和内存中数据集合,执行与远程服务器上的查询语句(例如LINQ to SQL)显然无法实现这个功能。
将LINQ语句转换为PLINQ语句极为简单,只需要在查询语句中From子句所指定的数据源的最后添加AsParallel()即可。随后Where、OrderBy
和Select子句将自动调用这个并行的LINQ版本。
PLINQ可以以三种方式执行。第一种是是管道处理:一个线程用来读取数据源,而其他线程则用来处理查询语句,二者同步进行,虽然这个单一的
消费线程可能并不那么容易与多个生成线程同步。不过若是能够仔细配置好负载平衡的话,任然会极大地减少内存占用。
第二种模式叫做"stop and go",用于处理结果集需要被一次返回时(例如调用ToList、ToArray或对结果排序)的情况。在这种模式下,将依次完成
各个处理过程,并将结果统一返回给消费线程。这个模式在性能上将优于第一种模式,因为它省去了用来保持线程同步所花费的开销。
第三种模式叫做"inverted enumeration"。这种方法并不需要实现收集到所有的输出,然后再单一的线程中处理,而是将最终调用的函数通过ForAll
扩展传递到每个线程中。这是目前为止最快的一种处理模式,不过这需要传递到ForAll中的函数是线程安全的,且最好不包含任何lock之类的互斥语句。
LINQ语法
1.
from 临时变量 in 实现IEnumerable<T>接口的对象
where条件表达式
[orderby 条件]
[group by 条件]
select 临时变量中被查询的值
2.
实现IEnumerable<T>接口的对象.LINQ方法名(Lambda表达式)。
如:
string input = "hello world";
int count=input.Count(w=>w==‘o‘);//查询字母o出现的次数
注意:能够使用LINQ的对象需要实现IEnumerable<T>接口。并且LINQ查询表达式是在最近
一次创建对象时才会被编译的。