基本查詢作業 (Visual Basic)
本主題簡單介紹 Visual Basic 中 Language-integrated Query (LINQ) 運算式,以及您在查詢中執行的幾個一般作業種類。 如需詳細資訊,請參閱下列主題:
指定資料來源 (From)
在 LINQ 查詢中,第一個步驟是指定要查詢的資料來源。 因此,一律會先指定查詢中的 From
子句。 查詢運算子會根據來源類型選取及塑造結果。
Dim query = From cust In customers
' ...
From
子句會指定資料來源、customers
和「範圍變數」cust
。 範圍變數就像迴圈反覆運算變數,差異在於查詢運算式中不會發生實際的反覆運算。 執行查詢時,範圍變數通常會透過使用 For Each
迴圈,成為 customers
中每個後續元素的參考。 因為編譯器可以推斷 cust
的類型,所以您不需要明確予以指定。 如需使用和未使用明確鍵入撰寫的查詢範例,請參閱查詢作業中的類型關聯性 (Visual Basic)。
如需如何在 Visual Basic 中使用 From
子句的詳細資訊,請參閱 From 子句。
篩選資料 (Where)
這可能是最常見的查詢作業,也就是以布琳運算式的形式套用篩選。 接著,查詢只傳回運算式成立的元素。 Where
子句可用來執行篩選。 篩選會指定要在產生的序列中包含資料來源中的哪些元素。 在下列範例中,只會包含地址在倫敦的客戶。
Dim londonCusts = From cust In customers
Where cust.City = "London"
' ...
您也可以使用 And
和 Or
等邏輯運算子,在 Where
子句中結合篩選條件運算式。 例如,若要只傳回來自倫敦且名字為 Devon 的客戶,請使用下列程式碼:
Where cust.City = "London" And cust.Name = "Devon"
若要傳回來自倫敦或巴黎的客戶,請使用下列程式碼︰
Where cust.City = "London" Or cust.City = "Paris"
如需如何在 Visual Basic 中使用 Where
子句的詳細資訊,請參閱 Where 子句。
將資料排序 (Order By)
將傳回的資料排序為特定順序通常很方便。 Order By
子句會使依傳回狀態排序的元素,在指定的一或多個欄位排序。 例如,下列查詢會根據 Name
屬性來排序結果。 因為 Name
是字串,所以傳回的資料會依字母順序從 A 到 Z 排序。
Dim londonCusts1 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
' ...
若要以相反順序排序結果 (從 Z 到 A),請使用 Order By...Descending
子句。 若未指定 Ascending
或 Descending
,則預設為 Ascending
。
如需如何在 Visual Basic 中使用 Order By
子句的詳細資訊,請參閱 Order By 子句。
選取資料 (Select)
Select
子句會指定傳回元素的形式和內容。 例如,您可以指定結果要包含完整的 Customer
物件、只有一個 Customer
屬性、一部分屬性、多種資料來源的屬性組合,或根據計算的新結果類型。 Select
子句不只產生一份來源項目時,作業稱為「投影」。
若要擷取包含完整 Customer
物件的集合,請選取範圍變數本身:
Dim londonCusts2 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust
如果 Customer
執行個體是具有許多欄位的大型物件,而且您只想要擷取名稱,則可以選取 cust.Name
,如下列範例所示。 區域型別推斷可辨識出這會將 Customer
物件集合的結果類型變更為字串集合。
Dim londonCusts3 = From cust In customers
Where cust.City = "London"
Order By cust.Name Ascending
Select cust.Name
若要從資料來源中選取多個欄位,您有兩個選項:
在
Select
子句中,指定您想要包含在結果中的欄位。 編譯器會定義匿名型別,這些欄位為其中的屬性。 如需詳細資訊,請參閱匿名型別。由於下列範例中傳回的元素是匿名型別的執行個體,所以您無法依程式碼中其他地方的名稱參考類型。 類型的編譯器指定名稱包含在一般 Visual Basic 程式碼中無效的字元。 在下列範例中,查詢在
londonCusts4
中傳回之集合中的元素,是匿名型別的執行個體Dim londonCusts4 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select Name = cust.Name, Phone = cust.Phone For Each londonCust In londonCusts4 Console.WriteLine(londonCust.Name & " " & londonCust.Phone) Next
-或-
定義具名類型,使其包含您想要包含在結果中的特定欄位,並在
Select
子句中建立類型的執行個體並加以初始化。 請在您必須在傳回這些結果的集合之外使用個別結果,或必須在方法呼叫中將其作為參數傳遞時,才使用此選項。 下列範例中的londonCusts5
類型為 IEnumerable (Of NamePhone)。Public Class NamePhone Public Name As String Public Phone As String ' Additional class elements End Class
Dim londonCusts5 = From cust In customers Where cust.City = "London" Order By cust.Name Ascending Select New NamePhone With {.Name = cust.Name, .Phone = cust.Phone}
如需如何在 Visual Basic 中使用 Select
子句的詳細資訊,請參閱 Select 子句。
聯結資料 (Join 和 Group Join)
您可以透過數種方式,在 From
子句中結合多個資料來源。 例如,下列程式碼會使用兩個資料來源,並在結果中隱含結合來自這兩個資料來源的屬性。 此查詢會選取姓氏開頭為母音的學生。
Dim vowels() As String = {"A", "E", "I", "O", "U"}
Dim vowelNames = From student In students, vowel In vowels
Where student.Last.IndexOf(vowel) = 0
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
For Each vName In vowelNames
Console.WriteLine(vName.Initial & ": " & vName.Name)
Next
注意
您可以使用在操作說明:建立項目清單中建立的學生清單來執行此程式碼。
Join
關鍵字等同於 SQL 中的 INNER JOIN
。 此關鍵字會根據兩個集合中元素之間的相符索引鍵值,結合兩個集合。 此查詢會傳回具有相符索引鍵值的全部或部分集合元素。 例如,下列程式碼會複製前一次隱含聯結的動作。
Dim vowelNames2 = From student In students
Join vowel In vowels
On student.Last(0) Equals vowel
Select Name = student.First & " " &
student.Last, Initial = vowel
Order By Initial
Group Join
將集合結合成單一階層式集合,就像 SQL 中的 LEFT JOIN
。 如需詳細資訊,請參閱 Join 子句和 Group Join 子句。
將資料分組 (Group By)
您可以新增 Group By
子句,以根據元素的一或多個欄位,將查詢結果中的元素分組。 例如,下列程式碼會依年級將學生分組。
Dim studentsByYear = From student In students
Select student
Group By year = student.Year
Into Classes = Group
For Each yearGroup In studentsByYear
Console.WriteLine(vbCrLf & "Year: " & yearGroup.year)
For Each student In yearGroup.Classes
Console.WriteLine(" " & student.Last & ", " & student.First)
Next
Next
如果您使用在操作說明:建立項目清單中建立的學生清單來執行此程式碼,For Each
陳述式的輸出為:
Year: Junior
Tucker, Michael
Garcia, Hugo
Garcia, Debra
Tucker, Lance
Year: Senior
Omelchenko, Svetlana
Osada, Michiko
Fakhouri, Fadi
Feng, Hanying
Adams, Terry
Year: Freshman
Mortensen, Sven
Garcia, Cesar
下方程式碼所示的變體會將年級排序,然後依姓氏排序各年級的學生。
Dim studentsByYear2 = From student In students
Select student
Order By student.Year, student.Last
Group By year = student.Year
Into Classes = Group
如需 Group By
的詳細資訊,請參閱 Group By 子句。