VB.NET查詢(xún)包含威力強(qiáng)大
在VB.NET新版本中,出現(xiàn)了很多新的特性,幫助開(kāi)發(fā)人員極大的提高了編程效率。不過(guò)這些初衷都是為了迎合.NET Framework新的數(shù)據(jù)框架——Linq。Linq的一個(gè)口號(hào)是“讓查詢(xún)無(wú)處不在”,它將類(lèi)似SQL的語(yǔ)法強(qiáng)類(lèi)型地引入到Visual Basic中,而且可以任意組合使用。不要以為只是把數(shù)據(jù)庫(kù)的SQL寫(xiě)到VB中而已,那樣就太小看Linq了。VB的目標(biāo)是讓一切包含數(shù)據(jù)的對(duì)象都可以用類(lèi)SQL查詢(xún),包含數(shù)據(jù)庫(kù)映射對(duì)象(DLinq),XML(XLinq),甚至是.NET Framework中的一切集合對(duì)象。
我們來(lái)看一個(gè)VB.NET查詢(xún)包含的例子。假如employee類(lèi)有firstname,lastname和age等屬性?,F(xiàn)在有一個(gè)list(of Employee)類(lèi)型的集合叫做emp。假設(shè)我們要查詢(xún)所有Age大于25的員工的姓名?;貞浺幌虑懊嫖覀兘榻B的特性怎么給查詢(xún)帶來(lái)新的變化。首先我們給IEnumerable增加擴(kuò)展方法Where:
- < Extension()> _
- Public Function Where()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將會(huì)增加的一組泛型委托之一,用于On-the-fly創(chuàng)建各種參數(shù)個(gè)數(shù)和類(lèi)型的委托,而不必聲明新的委托類(lèi)型。這里Func用于表示一個(gè)斷言。于是我們就把條件查詢(xún)封裝了。與此同時(shí),我們還可以封裝一個(gè)Select方法,用于數(shù)據(jù)類(lèi)型轉(zhuǎn)換,以此類(lèi)推,還可以有OrderBy和GroupBy等等……這些就成為L(zhǎng)inq的查詢(xún)算符。
回憶一下,我們還有嵌套函數(shù),于是可以按下列方法使用查詢(xún)算符:
- Function F()Function F(obj As Employee)As Boolean
- Return obj.Age > 25
- End Function
Dim result = emp.Where(AddressOf F)這里稍顯麻煩的就是,我們需要自己定義函數(shù),這樣進(jìn)行復(fù)雜查詢(xún)就會(huì)寫(xiě)得很累,即使可能會(huì)有l(wèi)ambda表達(dá)式幫助,我們也希望尋求更容易理解的方法,那就是VB.NET查詢(xún)包含Query Comprehension。新引入的Select,Where等查詢(xún)關(guān)鍵字可以幫你完成前面介紹的一整套內(nèi)容:#t#
Dim result = Select It From e In emp Where e.Age > 25一個(gè)簡(jiǎn)單的類(lèi)似SQL的語(yǔ)法就幫助你生成了匿名的嵌套函數(shù)和所有算符的調(diào)用。注意It的用法,Select It就表示選擇所有字段。我們只需要Employee的名字,那么就可以這樣寫(xiě):
Dim result = Select e.FirstName, e.LastName From e In emp Where e.Age > 25這樣,select語(yǔ)句就會(huì)把查詢(xún)的結(jié)果轉(zhuǎn)化成一個(gè)tuple(匿名類(lèi)型的實(shí)例),它僅包含你所需要的字段。慢慢你就會(huì)發(fā)現(xiàn),VB.NET查詢(xún)包含的威力可以延伸到你所能接觸到的一切數(shù)據(jù)。這種關(guān)系型的語(yǔ)法很快就會(huì)代替for Each的手工迭代工作。
我們知道VB9將在xml方面有卓越的改進(jìn),當(dāng)xml literal、XML后期綁定與VB.NET查詢(xún)包含的語(yǔ)法結(jié)合在一起后,將體現(xiàn)出非凡的簡(jiǎn)潔和高效,這是C# 3.0等同期語(yǔ)言無(wú)法比擬的,我們介紹到XML特性后再繼續(xù)介紹。