码迷,mamicode.com
首页 > 其他好文 > 详细

LINQ:开始使用 LINQ(一)- 介绍 LINQ 查询

时间:2016-08-20 06:39:27      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

开始使用 LINQ (一)- 介绍 LINQ 查询

  查询是一种从数据源检索数据的表达式。 随着时间的推移,人们已经为各种数据源开发了不同的语言;例如,用于关系数据库的 SQL 和用于 XML 的 XQuery。 因此,开发人员不得不针对他们必须支持的每种数据源或数据格式而学习新的查询语言。 LINQ 通过提供一种跨数据源和数据格式使用数据的一致模型,简化了这一情况。在 LINQ 查询中,始终会用到对象。可以使用相同的编码模式来查询和转换 XML 文档、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及对其有 LINQ 提供程序可用的任何其他格式的数据。  

一、查询操作的三个部分

  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 nums
11                 where (num % 2) == 0
12                 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 XML 将 XML 文档加载到可查询的 XElement 类型中:
1 //从 XML 中创建数据源
2 //using System.Xml.Linq;
3 var contacts = XElement.Load(@"c:\xxx.xml");

    在 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.Customers
6     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 numbers
3         where (num % 2) == 0
4         select num).ToList();
5 
6 var numQuery3 =
7       (from num in numbers
8        where (num % 2) == 0
9         select num).ToArray();

    此外,还可以通过在紧跟查询表达式之后的位置放置一个 foreach 循环来强制执行查询。但是,通过调用 ToList 或 ToArray,也可以将所有数据缓存在单个集合对象中。  

 

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

LINQ:开始使用 LINQ(一)- 介绍 LINQ 查询

标签:

原文地址:http://www.cnblogs.com/liqingwen/p/5787201.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!