共用方式為


基本查詢作業 (Visual Basic)

本主題提供在 Visual Basic 中 Language-Integrated 查詢 (LINQ) 表達式的簡短簡介,以及您在查詢中執行的一些一般作業類型。 如需詳細資訊,請參閱下列主題:

Visual Basic LINQ 簡介

查詢

逐步解說:在 Visual Basic 中撰寫查詢

指定資料來源 (來源)

在 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"
'                 ...

您可以使用AndOr等邏輯運算符,在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,當未指定 AscendingDescending 時。

如需如何在 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 子句

另請參閱