共用方式為


支援 LINQ 的 Visual Basic 功能

更新:2007 年 11 月

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

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

查詢運算式

Visual Basic 2008 中的查詢運算式可以透過類似於 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 簡介

隱含型別變數

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

注意事項:

只有在方法主體內定義區域變數,並將 Option Infer 設定為 On 時,才可以進行區域型別推斷。On 是 LINQ 中新專案的預設值。如需詳細資訊,請參閱 Option Infer 陳述式

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

' The variable name will be typed as a String.
Dim aName = "Virginia"
注意事項:

在 Visual Basic 2005 (含) 以前的版本中,這些範例都會進行編譯,但是指派給 aNumber 和 aName 的型別都是 Object。因此,在 Visual Basic 2008 中重新編譯並將 Option Infer 設定為 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

透過這種方式宣告的變數和明確指定型別的變數一樣,都是強型別 (Strongly Typed) 的變數。區域型別推斷可以用來建立 LINQ 查詢所需的匿名型別,但是也適用於任何區域變數。

如需詳細資訊,請參閱區域型別推斷

物件初始設定式

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

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

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

匿名型別

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

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

' 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

如需詳細資訊,請參閱匿名型別

擴充方法

擴充方法可讓您從定義外部將方法加入至資料型別或介面。這項功能實際上可讓您將新的方法加入至現有型別,而不需要實際修改該型別。標準查詢運算子本身就是一組擴充方法,可為實作 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)

概念

LINQ 和字串

其他資源

Language-Integrated Query (LINQ)

使用 Visual Basic 撰寫 LINQ 入門