Linq 入门(一)

Linq简介
 

 

LINQ是Language Integrated Query的简称,也就是语言集成查询。为什么说是语言集成查询呢?首先我们查询都是基于数据源的,而现实操作中数据源可能有很多种,比如数据库、xml、集合,集成查询就是让查询统一起来,只需要同一种语法来实现这些数据源的查询,而不必为不同的数据源去写操作方法。
.NET Framewor 3.0+ 的Linq架构包含Linq to XML、Linq to Objects、Linq to SQL、Linq to Datasets、Linq to Entities。
Linq是面向对象的,当然Linq也是易于扩展的,在Linq出世后,又涌现出不少的Linq Provider,诸如Linq to Json、Linq to Google、Linq to IQueryable等等,通过Linq架构并结合一些Linq Provider我们能够完成基本的数据源操作,为开发带来不少便捷。

Linq查询
 

 

Linq查询包含三个部分的操作:

  1. 获取数据源。
  2. 创建查询。
  3. 执行查询。

下面看一个简单的例子:

class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % 2) == 0
select num;

// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}

下图显示了完整的查询操作。在 LINQ 中,查询的执行(第三步)与查询本身(第二步)截然不同;换句话说,如果只是创建查询变量,则不会检索任何数据。

Bb397906.LINQ_Query(zh-cn,VS.90)

匿名局部变量

 

 

注意上面的代码中使用了var关键字,使用var关键字将告诉编译器去判断变量的数据类型,而我们无需多注意变量的类型,只需专心写Linq的表达式。

 

数据源

 

并不是所有的数据源都能够通过Linq来进行查询,Linq的数据源有一个基本的规则:LINQ 数据源是支持泛型 IEnumerable<T> 接口或从该接口继承的接口的任意对象。

在上面这个例子中,由于数据源是数组,数组类型是支持IEnumerable<T> 接口的,因此我们可以通过Linq来进行查询。

Bb397906.alert_note(zh-cn,VS.90).gif说明:

支持非泛型IEnumerable接口的类型(如ArrayList)也可用作LINQ数据源。有关更多信息,请参见如何:如何:使用 LINQ 查询 ArrayList

查询

 

查询就是创建查询的过程。在上面的例子中,查询表达式包含三个子句:from、where和select,在C# 3.0+ 中这几个关键字的语义和SQL中基本是一致的,只不过在这里写查询表达式时顺序有所不同。查询还可以指定在返回这些信息之前如何对其进行排序、分组和结构化。在这里,仍需要强调一点:在 LINQ 中,查询变量本身不执行任何操作并且不返回任何数据。

Bb397906.alert_note(zh-cn,VS.90).gif说明:

还可以使用方法语法来表示查询。有关更多信息,请参见查询语法与方法语法 (LINQ)

查询执行

延迟执行

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

// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}

 

foreach 语句也是检索查询结果的地方。例如,在上一个查询中,迭代变量 num 保存了返回的序列中的每个值(一次保存一个值)。

由于查询变量本身从不保存查询结果,因此可以根据需要随意执行查询。例如,可以通过一个单独的应用程序持续更新数据库。在应用程序中,可以创建一个检索最新数据的查询,并可以按某一时间间隔反复执行该查询以便每次检索不同的结果。

强制立即执行

对一系列源元素执行聚合函数的查询必须首先循环访问这些元素。CountMaxAverageFirst 就属于此类查询。由于查询本身必须使用 foreach 以便返回结果,因此这些查询在执行时不使用显式 foreach 语句。另外还要注意,这些类型的查询返回单个值,而不是 IEnumerable 集合。下面的查询返回源数组中偶数的计数:

var evenNumQuery = 
from num in numbers
where (num % 2) == 0
select num;

int evenNumCount = evenNumQuery.Count();

若要强制立即执行任意查询并缓存其结果,可以调用 ToList<TSource>ToArray<TSource> 方法。

List<int> numQuery2 =
(from num in numbers
where (num % 2) == 0
select num).ToList();

// or like this:
// numQuery3 is still an int[]

var numQuery3 =
(from num in numbers
where (num % 2) == 0
select num).ToArray();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值