基本查詢作業 (Visual Basic)

本主題簡單介紹 Visual Basic 中 Language-integrated Query (LINQ) 運算式,以及您在查詢中執行的幾個一般作業種類。 如需詳細資訊,請參閱下列主題:

Visual Basic 中的 LINQ 簡介

查詢

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

指定資料來源 (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"
'                 ...

您也可以使用 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)

將傳回的資料排序為特定順序通常很方便。 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 子句。 若未指定 AscendingDescending,則預設為 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 子句

另請參閱