会写这一篇是有原因的,不只一次有人问我,要不要学LINQ呢?
LINQ看起来很难耶……为何要放弃以前的SQL来学LINQ呢?到底LINQ的意义是什么?
反正就是有很多的问题,说真的,由于最近也没时间写本LINQ的书,但是工作累了顺手写写BLOG还可以,所已针对LINQ这个主题,和大家有一些分享。
其实对于VB开发人员来说,掌握LINQ说真的比C#来的简单很多,主要的原因就是VB当中有非常多"自动"的隐含型别转换,是不需要写程序代码的,也因此操作起来比起C#真的容易不少。
要掌握LINQ的精神,得要知道LINQ出现的目的,其实很简单,只有一句话,就是希望 "能够达成以单一的一种语法来查询多种不同的对象" 的目的。过去我们要查询数据库要用SQL、要查询XML要用XMLDOM对象、要查询AD又要用另一种不同的查询方式,总之,查询这个动作一天到晚出现在计算机程序代码当中,但是开发人员却要学习多种不同的方式,很困扰,所以LINQ就出现了。
所谓的LINQ,是 .NET Language Integrated Query,也就是在.NET的开发语言当中,直接把查询的技术给 "整" 进去,目的就是要加快搜寻(速度)与降低开发成本。
所以从.NET 3.5开始, LINQ变成.NET标准语法的一部分,OK,就是这样,所以我们来看看 LINQ怎么查询,首先,为了展示LINQ,我定义了底下这样的结构:
Structure BMI
Dim name As String
Dim height As Integer
Dim weight As Integer
Dim BmiValue As Single
End Structure
你用类型也可以,总之上面的结构用来表达一个人的身高,体重,名称和BMI值。
接着,我编写底下程序代码:
'定义数组
Dim matrix(5) As BMI
'填入测试资料
matrix(0).name = "王小宝"
matrix(0).height = 170
matrix(0).weight = 65
matrix(1).name = "韦大宝"
matrix(1).height = 176
matrix(1).weight = 95
matrix(2).name = "章新宝"
matrix(2).height = 150
matrix(2).weight = 55
matrix(3).name = "沈中宝"
matrix(3).height = 192
matrix(3).weight = 75
matrix(4).name = "萧敦宝"
matrix(4).height = 150
matrix(4).weight = 65
matrix(5).name = "林宝宝"
matrix(5).height = 177
matrix(5).weight = 75
上面这段程序代码就只是很简单的把数据填入,请注意我们只填入身高体重和姓名,接着,再利用底下的程序代码算出BMI:
'计算BMI
For i = 0 To 5
matrix(i).BmiValue = matrix(i).weight / (matrix(i).height / 100) ^ 2
Next
OK,到这边先告一个段落,以上都没有LINQ出现,动作也很简单,接下来换LINQ出场,在出场前先问读者一个问题,如果要找出BMI值>25的数据,你会怎么写程序?
没错,用for each指令,在没有LINQ功能的时代,我们只能用数组遍历的方式查找每一个元素,找出符合的数据,但是有底下几个问题:
1.为了找出特定的数据而跑整个数组,看起来挺蠢的。(不过说真的,如果数据没有排序,也就只能那么蠢)
2.可能有一些初学的菜鸟程序设计师,写出效率很差的查找程序。(例如不小心在for each当中做了一些不必要的动作)
OK,过去我们对于对象(或是对象数组)的操作,也就只能使用循环的方式,但是LINQ提出了一种新的可能,就是通过类似SQL的查找语法,让开发人员可以用简单的程序代码,就可以针对对象进行复杂的查询。(更重要的是,未来这种简单的查找语法变成主流之后,可以用以查询"各种不同的对象",而不只有查找"对象")
言归正传,若要查找出BMI值>25的数据,你可以透过底下的LINQ程序:
'查询BMI值大于25的人
Dim result = From c In matrix Where c.BmiValue > 25
结束,就是这样,而 result 就是找出的结果对象,你可以通过 result 来取得每一个符合条件的资料。简单的说,上面这段程序代码的意思是,从matrix对象集合当中,找出一些数据,这些数据的BmiValue属性大于25。其中的 c 只是编写程序代码方便,c代表该对象元素,你也可以用别的字眼..
而找出的数据result也是一个集合,你可以通过底下的程序代码来列出每一个BMI值符合条件者的名字:
'显示名称
For Each item In result
MsgBox(item.name)
Next
很简单不是吗? result 当中的每一个 item ,其型别就是 BMI,因为Result对象是LINQ语法跑出的结果,所以只有包含符合 BmiValue > 25 这个条件的人……
上面这段程序代码,还可以这样写……
'显示名称
For Each item In (From c In result Select c.name)
MsgBox(item)
Next
效果完全一样唷,但是,(From c In result Select c.name) 会产生一个对象,该对象只有符合条件者的名称(相当于一维数组),而item的型别当然就是string。
通过上面这样的指令,查找动作变得相当简单,还不仅如此,关键在于底下这样的语法:
'查询BMI值大于25的人
Dim result = From c In matrix Where c.BmiValue > 25
具有相当多不同的变化方式,可以组合出各种不同的形式,发挥出强大的查找力量,再加上学一次,就可以用在各种不同的地方(这边我们只用来查找对象,其实也可以查找XML和Database),使得LINQ的用途更加的广泛,这就是LINQ的价值与意义。
以后,再跟大家分享一些关于LINQ的其他部分,希望对大家有帮助,VB developer其实是幸福的,LINQ其实是很简单的……