`
tianshibaijia
  • 浏览: 1126477 次
文章分类
社区版块
存档分类
最新评论

12.4.1 自定义查询表达式

 
阅读更多

12.4.1 自定义查询表达式

原则上,我们可以使用查询处理任何支持绑定操作的类型。这是用于函数式编程中的标准名称,像上一节中所示的类型签名的函数。从技术角度讲,我们需要实现可以由 C# 编译器所使用的方法,把查询表达式转换为标准的函数调用。我们将为 12.6 节中的 Option<T> 的类型实现这些方法。该类型没有实现 IEnumerable<T>,所以,标准查询运算符不能使用。

让我们首先考虑一下,查询应用于选项类型意谓着什么。清单 12.15 显示了两个查询。左边一个处理列表,右边一个处理选项类型。我们将使用两个简单的函数来提供输入:ReadIntList 函数读取整数列表 (类型为 List<int>),TryReadInt 返回选项值(类型为 Option<int>)。

Listing 12.15 Using queries with lists and option values (C#)

var list =
from n in ReadIntList()
from m in ReadIntList()
select n * m;

var option =
from n in TryReadInt()
from m in TryReadInt()
select n * m;

除了处理的数据类型不同之外,查询完全相同,因此,它们使用不同的查询运算符实现。两个都读取不同的输入,并返回输入整数的积。表 12.1 给出了输入的样例,并显示了结果。

表 12.1 对于可能的不同输入,由处理列表和选项值的查询所产生的结果

Type of values Input #1 Input #2 Output

Lists
Options
Options
Options

[2; 3]
Some(2)
Some(3)
None

[10; 100]
Some(10)
None
Not required

[20; 200; 30; 300]
Some(20)
None
None

对于列表,查询执行交叉联接运算(可以想象成在 F# 的序列表达式中,两个嵌套的 for 循环),它会产生一个序列,由输入值的每种组合的条目所组成。对于选项值,有三种可能性。

■ 当第一个输入是值时,我们要看第二个。然后,根据第二个输入的不同,会发生以下两种情况:

— 如果第二个输入也是一个值,则结果也是 Some 值,包含的结果是积。

— 如果第二个输入是 None,由于没有值相乘,这样,查询返回 None。

■ 第一个输入为 None 时,我们知道这个结果无需第二输入。整个查询延迟执行,所以,我们不必去读第二输入:TryReadInt 函数只调用一次。

正如你所看到的,查询表达式提供了一种简便的方法,来处理选项值。清单 12.15 肯定要比我们在第 6 章中看到的等价代码,容易写 (和读),在那儿,我们显式地使用了高阶函数。在本章的后面,我们将会看到,如何实现所有必要的查询运算符,不过,我们还是先看一下在 F# 中的类似语法。

分享到:
评论

相关推荐

    LINQ 实战 1/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 3/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 4/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 2/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 7/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 11/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 5/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 6/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 8/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 10/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    LINQ 实战 9/11

    3.4.3 标准查询操作符与查询表达式的关系 75 3.4.4 限制 76 3.5 表达式树 78 3.5.1 Lambda表达式回顾 78 3.5.2 表达式树是什么 78 3.5.3 IQueryable,另一种实现延迟查询执行的方法 81 3.6 LINQ的程序...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    SQLServer2008技术内幕T-SQL查询包含源代码及附录A

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    Microsoft+SQL+Server+2008技术内幕:T-SQL查询_源代码及附录 中文版

    主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决...

    springMongodb参考文档中文版

    基于JSON的SpEL表达式查询 11.3.5。类型安全的查询方法 11.3.6。全文搜索查询 11.3.7。预测 11.4。杂 11.4.1。CDI集成 12.反应性MongoDB存储库 12.1。介绍 12.2。活性成分库 12.3。用法 12.4。特征 12.4.1。地理空间...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    15.2 查询表达式作为方法调用 439 15.3 小结 440 第16章 构建自定义集合 441 16.1 更多集合接口 442 16.1.1 IList与IDictionary 442 16.1.2 ICollection 443 16.2 主要集合类 443 16.2.1 ...

    ASP.NET3.5从入门到精通

    12.4.1 创建ASPX 页面 12.4.2 创建CSS 层叠样式表 12.4.3 创建框架集 12.5 小结 第 13 章 ASP.NET 内置对象,应用程序配置和缓存 13.1 ASP.NET 内置对象 13.1.1 Request 传递请求对象 13.1.2 Response 请求响应对象 ...

    ASP.NET 3.5 开发大全11-15

    12.4.1 创建ASPX页面 12.4.2 创建CSS层叠样式表 12.4.3 创建框架集 12.5 小结 第13章 ASP.NET内置对象,应用程序配置和缓存 13.1 ASP.NET内置对象 13.1.1 Request传递请求对象 13.1.2 Response请求响应对象 13.1.3 ...

    ASP.NET 3.5 开发大全

    12.4.1 创建ASPX页面 12.4.2 创建CSS层叠样式表 12.4.3 创建框架集 12.5 小结 第13章 ASP.NET内置对象,应用程序配置和缓存 13.1 ASP.NET内置对象 13.1.1 Request传递请求对象 13.1.2 Response请求响应对象 13.1.3 ...

    ASP.NET 3.5 开发大全1-5

    12.4.1 创建ASPX页面 12.4.2 创建CSS层叠样式表 12.4.3 创建框架集 12.5 小结 第13章 ASP.NET内置对象,应用程序配置和缓存 13.1 ASP.NET内置对象 13.1.1 Request传递请求对象 13.1.2 Response请求响应对象 13.1.3 ...

Global site tag (gtag.js) - Google Analytics