Evil 域

当Evil遇上先知

导航

VB 9.0新特性之LINQ(一)

Posted on 2008-06-30 15:53  Saar  阅读(1461)  评论(2编辑  收藏  举报

小到个人记账系统,大至ERP,现代程序开发,很大程度上,与数据库交互密不可分。然而,从关系型数据库的二维表模型到面向对象的树型结构的转化,常常让所有程序员绞尽脑汁。LINQ的出现,把转化过程予以封装,使得程序员只面向对象,即可完成数据库操作。虽然它还有许多有待完善的地方,不可否认,它的出现,有着重大的意义,它在关系模型与对象模型之间构建起一座桥梁,这让人激动不已。让我们来看一下VB9.0中的LINQ,给我们带来了什么。
我们通过一个简单的例子,来看看LINQ是怎么一回事。我们依然借用《VB 9.0新特性之局部类型推理(Local Type Inference)》一文中提到的Notebook类来作说明。
为简单、直观,第一步,我们创建一个对象集合来充当数据库:

1        'Create a collection act like a database
2        Dim nbStorage = New Notebook() _
3                        {New Notebook With {.Brand = "Lenovo", .Price = 27000, .Type = "X300", .Weight = 1.8} _
4                        , New Notebook With {.Brand = "HP", .Price = 7500, .Type = "V3742TU", .Weight = 2.3} _
5                        , New Notebook With {.Brand = "HP", .Price = 7800, .Type = "DV2730TX", .Weight = 2.2} _
6                        , New Notebook With {.Brand = "DELL", .Price = 7300, .Type = "D630", .Weight = 2.5} _
7                        }

第二步,创建一个查询:
例如,我们查询出所有价格超过7400元的笔记本:

1        'Create the query
2        'but the query will not execute right way
3        Dim result1 = From laptop In nbStorage _
4                    Where laptop.Price > 7400

第三步,执行查询:

1        'Execute the query
2        For Each laptop In result1
3            Console.WriteLine(laptop.ToString())
4        Next

查询结果如下:


可以看到,LINQ的使用还是蛮简单的,只需要三步即可完成:
1、确立数据源;
2、创建查询;
3、执行查询。

让我们来看一下,在上面一二三步中,我们做了什么。
首先,我们定义了一个Notebook类的对象数组,并且添加了4个对象实例。用这个来作为下面查询的数据源;
然后,我们创建了一个查询,这里用到了两个LINQ中的关键字:FROM、WHERE。每一个LINQ查询必须以FROM开头,FROM后面,分别指定查询出来的对象的名称和查询所用的数据集;而WHERE后面,则根了一个条件表达式,说明我要看的是laptop的单价高于7500的本本。
最后,我们用一个For Each循环,遍历查询result1中的每一个对象并将其输出到屏幕。
代码应该不难理解,需要注意的是,LINQ是延迟执行的。也就是说,在第二步中的时候,局部变量result1中并没有任何值。直到第三步For Each去遍历它的时候,它才从“数据库”中将值取了出来。

简单的修改一下代码,我们就可以验证一延迟执行机制:

 1
 2    Sub Main()
 3        'Create a collection act like a database
 4        Dim nbStorage = New Notebook() _
 5                        {New Notebook With {.Brand = "Lenovo", .Price = 27000, .Type = "X300", .Weight = 1.8} _
 6                        , New Notebook With {.Brand = "HP", .Price = 7500, .Type = "V3742TU", .Weight = 2.3} _
 7                        , New Notebook With {.Brand = "HP", .Price = 7800, .Type = "DV2730TX", .Weight = 2.2} _
 8                        , New Notebook With {.Brand = "DELL", .Price = 7300, .Type = "D630", .Weight = 2.5} _
 9                        }
10
11        'Create the query
12        'but the query will not execute right way
13        Dim result1 = From laptop In nbStorage _
14                    Where laptop.Price > 7400
15
16        'Change some value before query executes
17        nbStorage(0).Price = 26000
18
19        'Execute the query
20        For Each laptop In result1
21            Console.WriteLine(laptop.ToString())
22        Next
23
24    End Sub

注意一下第16、17行代码。如果13行的result1已经取得值,那么,第17行的修改将不会影响输出结果。但实际上,输出结果发生了变化,Lenovo的本本就这样下降了1000块钱^o^