zoukankan      html  css  js  c++  java
  • Visual Basic 9.0 前沿播报·静态篇(五)查询包含

    前面所介绍的Visual Basic 9.0新特性,初衷都是为了迎合.NET Framework新的数据框架——Linq。Linq的一个口号是“让查询无处不在”,它将类似SQL的语法强类型地引入到Visual Basic中,而且可以任意组合使用。不要以为只是把数据库的SQL写到VB中而已,那样就太小看Linq了。VB的目标是让一切包含数据的对象都可以用类SQL查询,包含数据库映射对象(DLinq),XML(XLinq),甚至是.NET Framework中的一切集合对象。

    我们来看一个例子。假如Employee类有FirstName,LastName和Age等属性。现在有一个List(Of Employee)类型的集合叫做emp。假设我们要查询所有Age大于25的员工的姓名。回忆一下前面我们介绍的特性怎么给查询带来新的变化。首先我们给IEnumerable增加扩展方法Where:

    <Extension()> _ Public Function Where(Of T)([Me] As IEnumerable(Of T), predicate As Func(Of T, Boolean))_ As IEnumerable(Of T) Dim result As New Collection(Of T) For Each Dim item In [Me] If predicate(item) Then result.Add(item) Next Return result End Function

    注意Func,这是.NET Framework将会增加的一组泛型委托之一,用于On-the-fly创建各种参数个数和类型的委托,而不必声明新的委托类型。这里Func用于表示一个断言。于是我们就把条件查询封装了。与此同时,我们还可以封装一个Select方法,用于数据类型转换,以此类推,还可以有OrderBy和GroupBy等等……这些就成为Linq的查询算符。

    回忆一下,我们还有嵌套函数,于是可以按下列方法使用查询算符:

    Function F(obj As Employee)As Boolean Return obj.Age > 25 End Function Dim result = emp.Where(AddressOf F)

    这里稍显麻烦的就是,我们需要自己定义函数,这样进行复杂查询就会写得很累,即使可能会有Lambda表达式帮助,我们也希望寻求更容易理解的方法,那就是查询包含Query Comprehension。新引入的Select,Where等查询关键字可以帮你完成前面介绍的一整套内容:

    Dim result = Select It From e In emp Where e.Age > 25
    一个简单的类似SQL的语法就帮助你生成了匿名的嵌套函数和所有算符的调用。注意It的用法,Select It就表示选择所有字段。我们只需要Employee的名字,那么就可以这样写:
    Dim result = Select e.FirstName, e.LastName From e In emp Where e.Age > 25

    这样,Select语句就会把查询的结果转化成一个Tuple(匿名类型的实例),它仅包含你所需要的字段。慢慢你就会发现,查询包含的威力可以延伸到你所能接触到的一切数据。这种关系型的语法很快就会代替For Each的手工迭代工作。

    我们知道VB9将在XML方面有卓越的改进,当XML literal、XML后期绑定与查询包含的语法结合在一起后,将体现出非凡的简洁和高效,这是C# 3.0等同期语言无法比拟的,我们介绍到XML特性后再继续介绍。

  • 相关阅读:
    The Future of Middleware and the BizTalk Roadmap
    FW: How to spawn a process that runs under the context of the impersonated user in Microsoft ASP.NET pages
    Strips illegal Xml characters
    luogu P2280 激光炸弹(二维前缀和)
    luogu P2704 炮兵阵地(经典状态压缩DP)
    SP1716 GSS3 Can you answer these queries III (线段树维护最大连续子段和)
    二分图判定、匹配问题
    C++语法综合 | 基于char*设计一个字符串类MyString
    luogu P1044 火车进出栈问题(Catalan数)
    C++设计模式 | 三种设计模式基础
  • 原文地址:https://www.cnblogs.com/Ninputer/p/240928.html
Copyright © 2011-2022 走看看