小到个人记账系统,大至ERP,现代程序开发,很大程度上,与数据库交互密不可分。然而,从关系型数据库的二维表模型到面向对象的树型结构的转化,常常让所有程序员绞尽脑汁。LINQ的出现,把转化过程予以封装,使得程序员只面向对象,即可完成数据库操作。虽然它还有许多有待完善的地方,不可否认,它的出现,有着重大的意义,它在关系模型与对象模型之间构建起一座桥梁,这让人激动不已。让我们来看一下VB9.0中的LINQ,给我们带来了什么。
我们通过一个简单的例子,来看看LINQ是怎么一回事。我们依然借用《VB 9.0新特性之局部类型推理(Local Type Inference)》一文中提到的Notebook类来作说明。
为简单、直观,第一步,我们创建一个对象集合来充当数据库:
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元的笔记本:
2 'but the query will not execute right way
3 Dim result1 = From laptop In nbStorage _
4 Where laptop.Price > 7400
第三步,执行查询:
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去遍历它的时候,它才从“数据库”中将值取了出来。
简单的修改一下代码,我们就可以验证一延迟执行机制:
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^
Little knowledge is dangerous.