语言集成查询(LINQ)
语言集成查询(LINQ)是一系列直接将查询功能集成到C#的技术统称。
LINQ 系列技术提供了针对对象 (LINQ to Objects)、关系数据库 (LINQ to SQL) 和 XML (LINQ to XML) 的一致查询体验。
class LINQQueryExpressions
{
static void Main()
{
// Specify the data source.
int[] scores = new int[] { 97, 92, 81, 60 };
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (int i in scoreQuery)
{
Console.Write(i + " ");
}
}
}
// Output: 97 92 81
一些LINQ扩展方法列表
扩展方法 | 描述 | 延迟 |
---|---|---|
All | 如果源数据中所有的条目都与谓词匹配,则返回true | 否 |
Any | 如果源数据中至少有一个条目与谓词匹配,则返回true | 否 |
Contains | 如果数据源含有指定的条目或值,则返回true | 否 |
Count | 返回数据源的条目数 | 否 |
First | 返回数据源的第一个条目 | 否 |
FirstOrDefault | 返回数据源的第一个条目,或无条目时返回默认值 | 否 |
Last | 返回数据源的最后一个条目 | 否 |
LastOrDefault | 返回数据源的最后条目,或无条目时返回默认值 | 否 |
Max Min | 返回lambda表达式表达的最大值或最小值 | 否 |
OrderBy OrderByDescending | 基于lambda表达式返回的值对源数据进行排序 | 是 |
Reverse | 反转数据源中的数据项的顺序 | 是 |
Select | 设计一个查询结果 | 是 |
SelectMany | 把每一个数据项投射到一个条目序列之中,然后把所有这些结果序列连接成一个序列 | 是 |
Single | 返回数据源的第一个条目,或者有多个匹配时抛出异常 | 否 |
SingleOrDefault | 返回数据源的第一个条目,或者无条目时,返回默认值;有多个匹配条目时,抛出一个异常 | 否 |
Skip SkipWhile | 跳过指定书目的元素,或者当谓词匹配时跳过 | 是 |
Sum | 对谓词选定的值求和 | 否 |
Take TakeWhile | 从数据源的开始出选择指定条目的元素,或当谓词匹配是选择条目 | 是 |
ToArray ToDictionary ToList | 把数据源转换成数组或其他集合类型 | 否 |
Where | 过滤掉数据源数据中与谓词不匹配的条目 | 是 |
延迟的LINQ查询
延迟的意思是,直到对结果进行枚举后,才会执行该查询,每次对记过进行枚举时都会从头求取查询结果。如:
Product[] products = {
new Product{Name="kayak",Category="Watesports",Price=275M},
new Product{Name="LifeJack",Category="Watesports",Price=48.95M},
new Product{Name="Soccer",Category="Soccer",Price=19.58M},
new Product{Name="Corner",Category="Soccer",Price=34.95M}
};
var foundProducts = products.OrderByDescending(e => e.Price)
.Take(3).Select(e => new { e.Name, e.Price });
string result = "";//延迟的LINQ查询定义的位置
products[2]=new Product{Name="kayak1",Category="Watesports",Price=276M};
//修改数据源
foreach (var prod in foundProducts)
{
result += prod.Name + ":" + prod.Price + " ";
}//枚举查询结果,它会显示修改数据源之后的结果
12345678910111213141516
在定义LINQ查询得位置和修改数据源的位置分别插入断点,两个断点出查看foundProducts会发现发生了改变,尽管初始化foundProducts之后并没有对foundProducts进行更改,只是更改了源数据而已,此时延迟的LINQ这一特性便展现出来了。