开始使用 LINQ (一)- 介绍 LINQ 查询
查询是一种从数据源检索数据的表达式。 随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的 SQL 和用于
一、查询操作的三个部分
1.操作三部曲:
(1)获取数据源
(2)创建查询
(3)执行查询
1 internal class Program 2 { 3 private static void Main(string[] args) 4 { 5 //1.获取数据源 6 var nums = new int[7] { 0, 1, 2, 3, 4, 5, 6 }; 7 8 //2.创建查询 9 var numQuery =10 from num in nums11 where (num % 2) == 012 select num;13 14 //3.执行查询15 foreach (var num in numQuery)16 {17 Console.WriteLine("{0}", num);18 }19 }20 }
下图显示了完整的查询操作。在 LINQ 中,查询的执行与查询本身截然不同;换句话说,查询本身指的是只创建查询变量,不检索任何数据。
二、数据源
在上一个示例中,由于数据源是数组,因此它隐式支持泛型 IEnumerable<T> 接口。 支持 IEnumerable<T> 或派生接口(如泛型 IQueryable<T>)的类型称为可查询类型。
可查询类型不需要进行修改或特殊处理就可以用作 LINQ 数据源。如果源数据还没有作为可查询类型出现在内存中,则 LINQ 提供程序必须以此方式表示源数据。 例如,LINQ to
1 //从 2 //using System.3 var contacts = XElement.Load(@"c:\xxx.");
在 LINQ to SQL 中,首先需要创建对象关系映射。 针对这些对象编写查询,然后由 LINQ to SQL 在运行时处理与数据库的通信。在下面的示例中,Customers 表示数据库中的特定表。
1 var db = new Northwnd(@"c:\northwnd.mdf");2 3 //查询在伦敦的客户4 var custQuery =5 from cust in db.Customers6 where cust.City == "London"7 select cust;
三、查询
查询指定要从数据源中检索的信息。 查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。 查询存储在查询变量中,并用查询表达式进行初始化。
之前的示例中的查询是从整数数组中返回所有的偶数。 该查询表达式包含三个子句:
from、
where 和
select。(如果您熟悉 SQL,您会注意到这些子句的顺序与 SQL 中的顺序相反。)
from 子句指定数据源,
where 子句指定应用筛选器,
select 子句指定返回的元素的类型。 目前需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。 它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。
四、查询执行
1.延迟执行
如前所述,查询变量本身只是存储查询命令。 实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发生。 此概念称为“延迟执行”。
2.强制立即执行
对一系列源元素执行聚合函数的查询必须首先循环访问这些元素。Count、Max、Average 和 First 就属于此类查询。由于查询本身必须使用 foreach 以便返回结果,因此这些查询在执行时不使用显式 foreach 语句。另外还要注意,这些类型的查询返回单个值,而不是 IEnumerable 集合。
var numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };var evenNumQuery = from num in numbers where (num % 2) == 0 select num;var evenNumCount = evenNumQuery.Count();
若要强制立即执行任意查询并缓存其结果,可以调用 ToList<TSource> 或 ToArray<TSource> 方法。
1 var numQuery2 =2 (from num in numbers3 where (num % 2) == 04 select num).ToList();5 6 var numQuery3 =7 (from num in numbers8 where (num % 2) == 09 select num).ToArray();
此外,还可以通过在紧跟查询表达式之后的位置放置一个 foreach 循环来强制执行查询。但是,通过调用 ToList 或 ToArray,也可以将所有数据缓存在单个集合对象中。
【来源】文字主要来自微软官方文档、部分图片也来自微软官方文档。
原标题:LINQ:开始使用 LINQ(一)
关键词:linq