本主題提供在 Visual Basic 中 Language-Integrated 查詢 (LINQ) 表達式的簡短簡介,以及您在查詢中執行的一些一般作業類型。 如需詳細資訊,請參閱下列主題:
Visual Basic LINQ 簡介
指定資料來源 (來源)
在 LINQ 查詢中,第一個步驟是指定您要查詢的數據源。 因此, From
查詢中的 子句一律會先行。 查詢運算子會根據來源的類型來選取並塑造結果。
Dim query = From cust In customers
' ...
子From
句會指定資料來源、 customers
和範圍變數cust
。 範圍變數就像迴圈的迭代變數,不同之處在於在查詢語句中,不會實際進行反覆運算。 執行查詢時,通常使用 For Each
迴圈,範圍變數會做為 中 customers
每個後續項目的參考。 因為編譯程式可以推斷 的 cust
型別,所以您不需要明確指定。 如需使用 和 沒有明確輸入所撰寫查詢的範例,請參閱 查詢作業中的類型關聯性 (Visual Basic) 。
如需如何在 Visual Basic 中使用 From
子句的詳細資訊,請參閱 From 子句。
篩選資料(其中)
最常見的查詢作業可能是以布爾表達式的形式套用篩選。 然後,查詢只會傳回表達式為 true 的元素。
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
句會導致傳回序列中的專案在指定的欄位或欄位上排序。 例如,下列查詢會根據 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
,當未指定 Ascending
或 Descending
時。
如需如何在 Visual Basic 中使用 Order By
子句的詳細資訊,請參閱 Order By 子句。
選擇資料 (選擇)
子句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 子句。
資料合併(合併和群組合併)
您可以使用數種方式,在 子句中 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
相當於 INNER JOIN
SQL 中的 。 它會根據兩個集合中元素的索引鍵值進行匹配,然後合併兩個集合。 查詢會返回集合中具匹配索引鍵值的所有或部分元素。 例如,下列程式代碼會複製先前隱含聯結的動作。
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 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
輸出為:
年:少年
塔克,邁克爾
加西亞,雨果
加西亞,黛布拉
塔克, 蘭斯
年級:大四
奧梅爾琴科,斯韋特蘭納
奧薩達,米奇科
法霍里,法迪
馮、韓英
亞當斯,特裡
學年:新生
莫滕森,斯文
加西亞,塞薩爾
下列程式碼的變化會先排序班級年份,然後依每一年中的學生的姓氏進行排序。
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 子句。