网络编程
位置:首页>> 网络编程>> 数据库>> 新Orcas语言特性-查询句法(3)

新Orcas语言特性-查询句法(3)

 来源:asp之家 发布时间:2010-07-16 12:58:00 

标签:Orcas,语言,查询,句法

查询句法 - 理解延迟执行(Deferred Execution)和使用ToList() 和ToArray()

在默认情形下,查询句法表达式的结果的类型是IEnumerable<T>。在上面的例子里,你会注意到所有的查询句法赋值是给IEnumerable<Product>, IEnumerable<string>, IEnumerable<Person>, IEnumerable<AlternatePerson>, 和 IEnumerable<MyProduct> 变量的。

IEnumerable<T>接口的一个很好的特征是,实现它们的对象可以把实际的查询运算延迟到开发人员第一次试图对返回值进行迭代(这是通过使用最早在VS 2005中C# 2.0 中引进的yield构造来达成的)时才进行。LINQ和查询句法表达式利用了这个特性,将查询的实际运算延迟到了你第一次对返回值进行循环时才进行。假如你对IEnumerable<T>的结果从不进行迭代的话,那么查询根本就不会执行。

譬如,考虑下面这个LINQ到SQL的例子:

不是在查询句法表达式声明的时候,而是在我们第一次试图对结果进行循环(上面红箭头标志的地方),才会去访问数据库以及取出填充Category对象所需的值。

这个延迟运算的行为结果变得非常有用,因为它促成了一些把多个LINQ查询和表达式链在一起的强有力的组合场景。譬如,我们可以把一个表达式的结果喂给另一个表达式,然后通过延迟运算,允许象LINQ 到SQL这样的ORM根据整个表达式树来优化raw SQL。我将在以后的一个博客贴子里对这样的场景做示范说明。

如何立刻对查询句法表达式做运算

如果你不要延迟查询运算,而是要对它们立刻就执行运算,你可以使用内置的ToList() 和ToArray() 运算符来返回一个包括了结果集的List<T>或者数组。

譬如,要返回一个基于范型的 List<T> 集合的话:

要返回一个数组的话:

在上面两种情形下,会立刻访问数据库,填充Category对象。

结语

查询句法在使用标准的LINQ查询运算符来表达查询时,提供了非常方便的声明式简化写法。它提供的句法可读性非常高,可以针对任何类型的数据(内存中的集合,数组,XML内容,以及象数据库这样的远程数据提供器,web服务等等)进行查询。一旦你熟悉这个句法后,你可以在任何地方应用这个知识。

在不远的将来,我将结束本语言系列的最后一部分,该部分将讨论新的匿名类型特性。然后我将转而讨论在实际应用中使用所有这些语言特性的一些非常实用的例子(特别是针对数据库和XML文件使用LINQ的例子)。

希望本文对你有所帮助,

Scott

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com