新Orcas语言特性-查询句法
来源:asp之家 发布时间:2010-07-16 12:58:00
【原文地址】New "Orcas" Language Feature: Query Syntax
【原文发表日期】 Saturday, April 21, 2007 2:12
上个月我开始了一个贴子系列,讨论作为Visual Studio和.NET框架Orcas版本一部分发布的一些新的VB和C#语言特性。今天的贴子要讨论另一个基础性的新语言特性:查询句法(Query Syntax)。
什么是查询句法(Query Syntax)?
查询句法是使用标准的LINQ查询运算符来表达查询时一个方便的声明式简化写法。该句法能在代码里表达查询时增进可读性和简洁性,读起来容易,也容易让人写对。Visual Studio 对查询句法提供了完整的intellisense和编译时检查支持。
在底下,C#和VB编译器则把查询句法的表达式翻译成明确的方法调用代码,这样的代码利用了Orcas中的新的扩展方法和Lambda表达式语言特性。
查询句法的例子:
在我以前的语言系列贴子里,我示范了你可以象下面这样声明一个Person类:
然后我们可以使用下面这样的代码,用一些个人信息来生成一个List<Person>集合实例,然后使用查询句法来对该集合做一个LINQ查询,只取出那些姓(last name)的首字母为G的人,按名字(first name)来排序(升序):
上面查询句法的表达式在语意上与下面明确使用LINQ扩展方法和Lambda表达式的代码是等同的:
使用查询句法方法的好处是,结果会是稍微容易读写些,这在表达式变得更繁复时尤其如此。
查询句法 - 理解from和select子句:
在C#中,每个查询表达式的句法从from子句开始,以select或group子句结束。from子句表示你要查询什么数据。select子句则表示你要返回什么数据,且应该以什么构形返回。
譬如,让我们再来看一下我们对List<Person>集合的查询:
在上面的代码片段里,"from p in people"表示了我要对"people" 这个集合做一个LINQ查询,我将用参数"p"代表我正查询的输入序列的每个项。我们将参数命名为"p" 这个事实是无关紧要的,我完全可以很容易地将其命名为"o", "x", "person"或我想要的任何名字。
在上面的代码片段里,语句结尾的"select p"子句表示,作为查询的结果,我要返回一个Person对象的IEnumerable序列。这是因为"people"集合包含了Person类型的对象,而参数p则代表了输入序列中的Person对象。因此,该查询句法表达式的结果数据类型是IEnumerable<Person>。
假如不是返回Person对象,我想返回该集合中的人的名字,我可以把查询改写成这样:
注意上面我不再说"select p",而是说"select p.FirstName"。这表示我不想返回一串Person对象,而是想返回一串字符串,由Person对象的FirstName属性(该属性是个字符串)填充而来。 因此,该查询句法表达式的结果类型是 IEnumerable<string>。
针对数据库的查询句法的例子
LINQ的妙处在于,我可以针对任何数据类型使用完全一样的查询句法。譬如,我可以使用Orcas提供的新LINQ到SQL对象关系映射器支持,对SQL服务器的Northwind数据库进行建模,生成下面这些类(请观看我这里的录像来学习该如何实现):
在上面定义好类模型之后(以及它与数据库间的映射关系),然后我就可以写个查询句法的表达式取出那些单价大于99元的产品:
在上面的代码片段里,我表示我要对NorthwindDataContext类的Products表进行一个LINQ查询,NorthwindDataContext类是由Visual Studio orcas的ORM设计器生成的。"select p"表示我要返回匹配我的查询的一串Product对象,因此,该查询句法表达式的结果数据类型是IEnumerable<Product>。
就象前面List<Person>查询句法的例子一样,C# 编译器会把我们的声明式查询句法翻译成明确的扩展方法调用(使用Lambda表达式作为参数)。在上面的LINQ到SQL的例子的情形下,这些Lambda表达式会被转化成SQL命令,然后在SQL服务器上做运算(这样,只有那些匹配查询条件的Product记录行会返回到我们的应用中)。促成这个Lambda->SQL 转化的机制的细节可见于我的Lambda表达式博客贴子的"Lambda表达式树"部分。


猜你喜欢
- 一、正则表达式特殊变量1、$n :包含上次模式匹配的第n个子串2、$& :前一次成功模式匹配的字符串3、$` :前次匹配成功的子串之
- 问题:项目中有一个需求,一个tabBar下面如果没有内容就不让该tabBar显示,当然至于有没有内容,需要我们通过请求的来判断,但是由于请求
- 本人刚开始学习python,看了一段时间视频教程之后,决定做一个小游戏来巩固一下知识点,就做了一个文字版飞行棋,暂不具备图形界面。把代码贴出
- 由于项目是thinkPHP做后端框架,一直以来都是多页面的后端路由,想使用火热的webpack有点无从下手(原谅我太菜,而且推广vue只有我
- 前言:交换机模式主要包括:交换机之发布订阅、交换机之关键字和交换机之通配符。1、交换机之发布订阅 发布订阅和简单的消息队列区别在于
- 本文实例讲述了js正则匹配中文标点符号的方法。分享给大家供大家参考,具体如下:运行效果截图如下:具体代码如下:<html><
- PyTorch加载模型model.load_state_dict()问题希望将训练好的模型加载到新的网络上。如上面题目所描述的,PyTorc
- 前言在日常工作中,可能需要结合网上现在的一些API或者公司提供的数据接口来得到相应的数据或者实现对应的功能。因此API的调用和数据接口的访问
- Residual BlockResNet中最重要的组件是残差块(residual block),也称为残差单元(residual unit)
- 一.问题描述python 中使用open打开某个文件写入时,往往会发现需要写入的文件不在同级目录下。这样就需要根据文件的路径来找到并打开。但
- SELECT FORMAT(12562.6655,2);结果:12,562.67查看文档:Formats the number X to a
- 预测结果转为numpy:logits=model(feature)#如果模型是跑在GPU上result=logits.data.cpu().
- 虽然 prometheus 已有大量可直接使用的 exporter 可供使用,以满足收集不同的监控指标的需要。例如,node exporte
- 采集中 或者 在线添加文章中 都可以用到此功能俺自己在baidu上搜索的保存远程图片到本地的代码 感觉比较难用点 而且没有现成的比较全的代码
- 如何用SA-FileUp上传多个文件?表单处理: <%@&nbs
- 本文实例讲述了Golang排列组合算法问题之全排列实现方法。分享给大家供大家参考,具体如下:【排列组合问题】一共N辆火车(0<N<
- 文章目录 微信登录问题Python chrome driver操作导入库并声明浏览器:完整流程:用js来预约生成js代码 主函数——程序出错
- 1、什么是偏函数partialpython中提供一种对于函数固定属性的函数 2、偏函数的作用把一个函数的某些参数给固定住(也就是设
- '/***' 作 者 :冻结回忆'修改时间:2007-10-17'功能说明
- 在US BlackHat 2018大会上,安全人员证明,攻击者不仅可以利用PHAR包发动RCE攻击,而且,通过调整其二进制内容,他们还可以将