你的位置:首页 > ASP.net教程

[ASP.net教程]LINQ:开始使用 LINQ(一)


开始使用 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;

    

三、查询

  查询指定要从数据源中检索的信息。 查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。 查询存储在查询变量中,并用查询表达式进行初始化。

  之前的示例中的查询是从整数数组中返回所有的偶数。 该查询表达式包含三个子句:fromwhere 和 select。(如果您熟悉 SQL,您会注意到这些子句的顺序与 SQL 中的顺序相反。)from 子句指定数据源,where 子句指定应用筛选器,select 子句指定返回的元素的类型。 目前需要注意的是,在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。 它只是存储在以后某个时刻执行查询时为生成结果而必需的信息。
 

四、查询执行

  1.延迟执行

    如前所述,查询变量本身只是存储查询命令。  实际的查询执行会延迟到在 foreach 语句中循环访问查询变量时发生。 此概念称为“延迟执行”。

  2.强制立即执行

    对一系列源元素执行聚合函数的查询必须首先循环访问这些元素。CountMaxAverage 和 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,也可以将所有数据缓存在单个集合对象中。  

 

【来源】文字主要来自微软官方文档、部分图片也来自微软官方文档。