新Orcas语言特性-查询句法(3)
来源:asp之家 发布时间:2010-07-16 12:58:00
查询句法 - 理解延迟执行(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


猜你喜欢
- 写一个 python 脚本需要用到 dbus,但因为 dbus-python 这个包并没有提供 setup.py , 所以无法通过 pip
- django处理Ajax跨域访问使用javascript进行ajax访问的时候,出现如下错误出错原因:javascript处于安全考虑,不允
- 本文实例为大家分享了Thinkphp微信公众号支付接口,供大家参考,具体内容如下第一步 先把文件夹的那两个图片 配置成一样的路径
- 前言:写小程序时,遇到个需要自定义回归时间的场景,下面是实现的效果图。 于我需求而言,我只需要用到fixed_in
- 快捷键1、编辑(Editing)Ctrl + Space 基本的代码完成(类、方法、属性)Ctrl + Alt + Space 快速导入任意
- UCD介绍UCD是Unicode字符数据库(Unicode Character DataBase)的缩写。UCD由一些描述Unicode字符
- mysql连接超时和mysql连接错误在生产环境中,偶尔且不规律的出现mysql连接超时和创建连接出错的问题:15-09-2020 13:2
- Python装饰器,分两部分,一是装饰器本身的定义,一是被装饰器对象的定义。一、函数式装饰器:装饰器本身是一个函数。1.装饰函数:被装饰对象
- 写在前面作为一名找不到工作的爬虫菜鸡人士来说,登陆这一块肯定是个比较大的难题。 从今天开始准备一点点对大型网站进行逐个登陆破解。加
- 苦逼的前夜昨晚很辛苦,搞到晚上快两点,最后还是没有把python3下的scrapy框架安装起来,后面还把yum这玩意给弄坏了,一直找不到命令
- 我就废话不多说了,直接上代码吧!#全0和全1矩阵v1 = tf.Variable(tf.zeros([3,3,3]), name="
- Python 是由吉多·范罗苏姆(Guido Van Rossum)在 90 年代早期设计。 它是如今最常用的编程语言之一。它的语法简洁且优
- 您可以使用 ObjectContext 对象提交或放弃一项由 Microsoft Transaction Server (MTS) 管理的事
- Method通过一条指令即可完成:os.system('所需指令')Note: os.system('所需指令
- MySql版本问题sql_mode=only_full_group_by查看sql_modeselect @@sql_mode查询出来的值为
- 朋友去面试。对方问他:说说你之前做的那个站,有什么地方好的?朋友就说:用户体验比别的站好。对方又问:你怎么知道用户体验比别的好?朋友于是又磕
- 笔者今天就谈谈自己对这两种操作模式的理解,并且给出一些可行的建议,跟大家一起来提高Oracle数据库的安全性。 一、非归档模式的利与弊。 非
- 1 predict()方法当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.arg
- 在网上有很多相关主题的讨论,但是一般都是用Iframe和XMLHTTP来实现。Iframe的实现可能是最常看到的。很多论坛和聊天室的无刷新效
- 写在前面在上一篇文章Python徒手实现手写数字识别—大纲中,我们已经讲过了我们想要写的全部思路,所以我们不再说全部的思路。我这一次将图片的