共用方式為


支援 LINQ 的 Visual Basic 功能

更新:2011 年 5 月

Language-Integrated Query (LINQ) 這個名稱是指 Visual Basic 中的一項技術,這項技術可直接支援語言中的查詢語法和其他語言建構。 透過 LINQ,您不需要學習新語言即可查詢外部資料來源。 您可以使用 Visual Basic 查詢關聯式資料庫、XML 存放區或物件中的資料。 這種將查詢功能與語言整合的方式可以讓您在編譯時期檢查語法錯誤和型別安全 (Type Safety)。 這項整合也可以確保您已經大致了解在 Visual Basic 中撰寫豐富又多樣化的查詢時所必須具備的知識。

下列各節詳細說明支援 LINQ 的語言建構,使您能夠開始閱讀簡介文件、程式碼範例和範例應用程式。 您也可以按一下連結,找出語言功能如何共同啟用語言整合查詢的詳細說明。 其中最佳的入門是逐步解說:在 Visual Basic 中撰寫查詢

查詢運算式

Visual Basic 中的查詢運算式可以透過類似 SQL 或 XQuery 的宣告式語法來表示。 編譯期間查詢語法會轉換為對 LINQ 提供者實作的標準查詢運算子擴充方法進行的方法呼叫。 應用程式可透過使用 Imports 陳述式 (Statement) 指定適當的命名空間 (Namespace),控制哪些標準查詢運算子會在範圍之內。 Visual Basic 查詢運算式的語法與下面所示類似:

Dim londonCusts = From cust In customers
                  Where cust.City = "London"
                  Order By cust.Name Ascending
                  Select cust.Name, cust.Phone

如需詳細資訊,請參閱 Visual Basic 中的 LINQ 簡介

隱含型別變數

您可以讓編譯器推斷並指派型別,而不是在宣告及初始化變數時明確指定型別。 這種方法稱為「區域型別推斷」(Local Type Inference)。

藉由推斷取得型別的變數和明確指定型別的變數一樣,都是強型別 (Strongly Typed) 的變數。 只有在方法主體內定義區域變數,才可以進行區域型別推斷。 如需詳細資訊,請參閱 Option Infer 陳述式區域型別推斷 (Visual Basic)

下列範例說明區域型別推斷。 若要使用此範例,您必須將 Option Infer 設為 On。

' The variable number will be typed as an integer.
Dim aNumber = 5

' The variable name will be typed as a String.
Dim aName = "Virginia"

區域型別推斷也可以用來建立 LINQ 查詢所需的匿名型別,本主題稍後將會加以描述。

在下列 LINQ 範例中,型別推斷會在 Option Infer 為 On 或 Off 時發生。 如果 Option Infer 為 Off 且 Option Strict 為 On,則會發生編譯時期錯誤。

' Query example.
' If numbers is a one-dimensional array of integers, num will be typed
' as an integer and numQuery will be typed as IEnumerable(Of Integer)--
' basically a collection of integers.

Dim numQuery = From num In numbers
               Where num Mod 2 = 0
               Select num

物件初始設定式

當您必須建立用來保存查詢結果的匿名型別時,可以在查詢運算式中使用物件初始設定式。 物件初始設定式也可以用來初始化查詢外部之具名型別的物件。 使用物件初始設定式,您可以在單行中初始化物件,而不需要明確呼叫建構函式。 假設您有一個名為 Customer 的類別具有公用的 Name 和 Phone 屬性,以及其他屬性,則可以透過下列方式來使用物件初始設定式:

Dim aCust = New Customer With {.Name = "Mike",
                               .Phone = "555-0212"}

如需詳細資訊,請參閱物件初始設定式:具名和匿名型別 (Visual Basic)

匿名型別

匿名型別提供一種簡便的方式,可以暫時將一組屬性群組成您想包含在查詢結果的項目。 透過這種方式,您可以依照任何順序選擇查詢中可用欄位的任意組合,而不需要定義該項目的具名資料型別。

「匿名型別」(Anonymous Type) 是由編譯器以動態方式建構的型別。 型別的名稱由編譯器指定,而且可能隨著每次進行新的編譯而改變。 因此,您不能直接使用這個名稱。 匿名型別初始化的方式如下:

' Outside a query.
Dim product = New With {.Name = "paperclips", .Price = 1.29}

' Inside a query.
' You can use the existing member names of the selected fields, as was
' shown previously in the Query Expressions section of this topic.
Dim londonCusts1 = From cust In customers
                   Where cust.City = "London"
                   Select cust.Name, cust.Phone

' Or you can specify new names for the selected fields.
Dim londonCusts2 = From cust In customers
                   Where cust.City = "London"
                   Select CustomerName = cust.Name,
                   CustomerPhone = cust.Phone

如需詳細資訊,請參閱匿名型別 (Visual Basic)

擴充方法

擴充方法可讓您從定義外部將方法加入至資料型別或介面。 這項功能實際上可讓您將新的方法加入至現有型別,而不需要實際修改該型別。 標準查詢運算子本身就是一組擴充方法,可為實作 IEnumerable<T> 的任何型別提供 LINQ 查詢功能。IEnumerable<T> 的其他擴充項目包括 CountUnionIntersect

下列擴充方法會將列印方法加入至 String 類別。

' Import System.Runtime.CompilerServices to use the Extension attribute.
<Extension()>
    Public Sub Print(ByVal str As String)
    Console.WriteLine(str)
End Sub

呼叫此方法的方式與 String 的一般執行個體方法 (Instance Method) 相同:

Dim greeting As String = "Hello"
greeting.Print()

如需詳細資訊,請參閱擴充方法 (Visual Basic)

Lambda 運算式

「Lambda 運算式」(Lambda Expression) 是沒有名稱的函式,會計算並傳回單一值。 不同於具名函式,Lambda 運算式可以同時定義及執行。 下列範例顯示的是 4。

Console.WriteLine((Function(num As Integer) num + 1)(3))

您可以將 Lambda 運算式定義指派成變數名稱,然後使用該名稱來呼叫函式。 下列範例也會顯示 4。

Dim add1 = Function(num As Integer) num + 1
Console.WriteLine(add1(3))

在 LINQ 中,Lambda 運算式是許多標準查詢運算子的基礎。 編譯器會建立 Lambda 運算式以擷取基本查詢方法 (例如 Where、Select、Order By、Take While 等等) 中定義的計算。

例如,下列程式碼定義的查詢會從學生清單中傳回所有的高年級學生。

Dim seniorsQuery = From stdnt In students
                   Where stdnt.Year = "Senior"
                   Select stdnt

查詢定義會編譯成與下列範例類似的程式碼,而範例中則使用兩個 Lambda 運算式來指定 Where 和 Select 的引數。

Dim seniorsQuery2 = students.
    Where(Function(st) st.Year = "Senior").
    Select(Function(s) s)

這兩個版本都可以使用 For Each 迴圈 (Loop):

For Each senior In seniorsQuery
    Console.WriteLine(senior.Last & ", " & senior.First)
Next

如需詳細資訊,請參閱 Lambda 運算式 (Visual Basic)

請參閱

參考

Option Infer 陳述式

Option Strict 陳述式

概念

LINQ 和字串

支援 LINQ 的 C# 功能

其他資源

LINQ (Language-Integrated Query)

使用 Visual Basic 撰寫 LINQ 入門

變更記錄

日期

記錄

原因

2011 年 5 月

已修改<隱含型別變數>一節。

內容 Bug 修正。