前面所介绍的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:
![None.gif](http://blog.joycode.com/images/OutliningIndicators/None.gif)
![ExpandedBlockStart.gif](http://blog.joycode.com/images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](http://blog.joycode.com/images/OutliningIndicators/ContractedBlock.gif)
![InBlock.gif](http://blog.joycode.com/images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://blog.joycode.com/images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://blog.joycode.com/images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://blog.joycode.com/images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://blog.joycode.com/images/OutliningIndicators/InBlock.gif)
![InBlock.gif](http://blog.joycode.com/images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](http://blog.joycode.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
注意Func,这是.NET Framework将会增加的一组泛型委托之一,用于On-the-fly创建各种参数个数和类型的委托,而不必声明新的委托类型。这里Func用于表示一个断言。于是我们就把条件查询封装了。与此同时,我们还可以封装一个Select方法,用于数据类型转换,以此类推,还可以有OrderBy和GroupBy等等……这些就成为Linq的查询算符。
回忆一下,我们还有嵌套函数,于是可以按下列方法使用查询算符:
![ExpandedBlockStart.gif](http://blog.joycode.com/images/OutliningIndicators/ExpandedBlockStart.gif)
![ContractedBlock.gif](http://blog.joycode.com/images/OutliningIndicators/ContractedBlock.gif)
![InBlock.gif](http://blog.joycode.com/images/OutliningIndicators/InBlock.gif)
![ExpandedBlockEnd.gif](http://blog.joycode.com/images/OutliningIndicators/ExpandedBlockEnd.gif)
![None.gif](http://blog.joycode.com/images/OutliningIndicators/None.gif)
![None.gif](http://blog.joycode.com/images/OutliningIndicators/None.gif)
这里稍显麻烦的就是,我们需要自己定义函数,这样进行复杂查询就会写得很累,即使可能会有Lambda表达式帮助,我们也希望寻求更容易理解的方法,那就是查询包含Query Comprehension。新引入的Select,Where等查询关键字可以帮你完成前面介绍的一整套内容:
![None.gif](http://blog.joycode.com/images/OutliningIndicators/None.gif)
![None.gif](http://blog.joycode.com/images/OutliningIndicators/None.gif)
这样,Select语句就会把查询的结果转化成一个Tuple(匿名类型的实例),它仅包含你所需要的字段。慢慢你就会发现,查询包含的威力可以延伸到你所能接触到的一切数据。这种关系型的语法很快就会代替For Each的手工迭代工作。
我们知道VB9将在XML方面有卓越的改进,当XML literal、XML后期绑定与查询包含的语法结合在一起后,将体现出非凡的简洁和高效,这是C# 3.0等同期语言无法比拟的,我们介绍到XML特性后再继续介绍。