Visual Basic 中的 LINQ 簡介
Language-Integrated Query (LINQ) 可以在 Visual Basic 加入查詢功能,同時提供簡單、強大的功能,幫助您操作各種類型的資料。 LINQ 不會將查詢傳送到資料庫進行處理,也不會針對所搜尋的每種資料型別使用不同的查詢語法,而是在 Visual Basic 語言中加入查詢這一項功能。 所以,不論資料型別為何,都會使用統一的語法進行處理。
LINQ 可以讓您透過下列來源中查詢資料:SQL Server 資料庫、XML、記憶體中陣列和集合、ADO.NET 資料集或任何其他支援 LINQ 的遠端或本機資料來源。 使用一般 Visual Basic 語言項目即可執行上述所有動作。 因為您的查詢是以 Visual Basic 語言撰寫,所以查詢結果會以強型別物件傳回。 這些物件支援 IntelliSense,可以讓您更快地撰寫程式碼,以及在編譯時期就能發現查詢中的錯誤,而不用等到執行階段。 LINQ 查詢可以做為限定結果的其他查詢來源之用。 也可以繫結至控制項,讓使用者能輕易地檢視及修改查詢結果。
例如,下列程式碼範例會顯示 LINQ 查詢從集合傳回客戶清單並且根據其位置加以群組。
' Obtain a list of customers.
Dim customers As List(Of Customer) = GetCustomers()
' Return customers that are grouped based on country.
Dim countries = From cust In customers
Order By cust.Country, cust.City
Group By CountryName = cust.Country
Into CustomersInCountry = Group, Count()
Order By CountryName
' Output the results.
For Each country In countries
Debug.WriteLine(country.CountryName & " count=" & country.Count)
For Each customer In country.CustomersInCountry
Debug.WriteLine(" " & customer.CompanyName & " " & customer.City)
Next
Next
' Output:
' Canada count=2
' Contoso, Ltd Halifax
' Fabrikam, Inc. Vancouver
' United States count=1
' Margie's Travel Redmond
在本主題中,您會看到下列領域的詳細資訊:
執行範例
LINQ 提供者
LINQ 查詢的結構
Visual Basic LINQ 查詢運算子
使用 LINQ to SQL 連接到資料庫
支援 LINQ 的 Visual Basic 功能
執行延後與立即查詢
Visual Basic 中的 XML
相關資源
HOW TO 和逐步解說主題
執行範例
若要執行此範例在展示層和 < LINQ 查詢的結構」部分,包括下列程式碼中,傳回客戶和訂單清單。
' Return a list of customers.
Private Function GetCustomers() As List(Of Customer)
Return New List(Of Customer) From
{
New Customer With {.CustomerID = 1, .CompanyName = "Contoso, Ltd", .City = "Halifax", .Country = "Canada"},
New Customer With {.CustomerID = 2, .CompanyName = "Margie's Travel", .City = "Redmond", .Country = "United States"},
New Customer With {.CustomerID = 3, .CompanyName = "Fabrikam, Inc.", .City = "Vancouver", .Country = "Canada"}
}
End Function
' Return a list of orders.
Private Function GetOrders() As List(Of Order)
Return New List(Of Order) From
{
New Order With {.CustomerID = 1, .Amount = "200.00"},
New Order With {.CustomerID = 3, .Amount = "600.00"},
New Order With {.CustomerID = 1, .Amount = "300.00"},
New Order With {.CustomerID = 2, .Amount = "100.00"},
New Order With {.CustomerID = 3, .Amount = "800.00"}
}
End Function
' Customer Class.
Private Class Customer
Public Property CustomerID As Integer
Public Property CompanyName As String
Public Property City As String
Public Property Country As String
End Class
' Order Class.
Private Class Order
Public Property CustomerID As Integer
Public Property Amount As Decimal
End Class
LINQ 提供者
「LINQ 提供者」(LINQ Provider) 會將您的 Visual Basic LINQ 查詢對應至要查詢的資料來源。 當您撰寫 LINQ 查詢時,提供者會接受該查詢並將其轉譯成資料來源可以執行的命令。 提供者還會將資料從來源轉換為組成查詢結果的物件。 最後,在您將更新傳送至資料來源後,它會將物件轉換為資料。
Visual Basic 包含下列 LINQ 提供者。
提供者 |
描述 |
LINQ to Objects |
LINQ to Objects 提供者可以讓您查詢記憶體中集合和陣列。 如果某個物件支援 IEnumerable 或 IEnumerable<T> 介面,LINQ to Objects 提供者可以讓您查詢該物件。 匯入 System.Linq 命名空間即可啟用 LINQ to Objects 提供者,依預設會針對所有 Visual Basic 專案進行匯入。 如需 LINQ to Objects 提供者的詳細資訊,請參閱 LINQ to Objects。 |
LINQ to SQL |
LINQ to SQL 提供者可以讓您查詢及修改 SQL Server 資料庫中的資料。 將應用程式的物件模型對應至資料庫中的表格和物件,會因此變得很容易。 Visual Basic 加入了物件關聯式設計工具 (O/R 設計工具),讓使用 LINQ to SQL 變得更加容易。 這個設計工具是用來建立應用程式的物件模型會對應至資料庫中的物件。O/R 設計工具也提供功能給預存程序和函式對應至 DataContext 物件,以管理資料庫的通訊並儲存開放式並行存取檢查的狀態。 如需 LINQ to SQL 提供者的詳細資訊,請參閱 LINQ to SQL。 如需物件關聯式設計工具的詳細資訊,請參閱Object Relational Designer (O/R Designer)。 |
LINQ to XML |
LINQ to XML 提供者可以讓您查詢及修改 XML。 您可以修改記憶體內部 XML,或載入 XML 並儲存至檔案。 此外,LINQ to XML 提供者會啟用 XML 常值 (Literal) 和 XML 軸屬性,這些項目可以讓您直接在 Visual Basic 程式碼中撰寫 XML。 如需詳細資訊,請參閱Visual Basic 中的 XML。 |
LINQ to DataSet |
LINQ to DataSet 提供者可以讓您查詢並更新 ADO.NET 資料集中的資料。 如果應用程式會使用資料集來簡化並擴充查詢、彙總及更新資料集中資料的功能,您就可以將 LINQ 的功能加入至這些應用程式。 如需詳細資訊,請參閱LINQ to DataSet。 |
LINQ 查詢的結構
LINQ 查詢通常稱為「查詢運算式」(Query Expression),是由識別資料來源的子句和查詢的反覆運算變數所組成。 查詢運算式也可以包含套用至來源資料之排序、篩選、群組、聯結 (Join) 或計算的指示。 查詢運算式語法類似 SQL 語法,因此您可以發現語法有許多相似處。
查詢運算式以 From 子句開始。 此子句會識別查詢的來源資料,以及用來個別參考來源資料之每個項目的變數。 這些變數稱為「範圍變數」(Range Variable) 或「反覆運算變數」(Iteration Variable)。 查詢需有 From 子句,但 Aggregate 查詢除外,其中的 From 子句是選擇項。 在 From 或 Aggregate 子句中識別查詢的範圍和來源後,您可以包含任何查詢子句的組合以限定查詢。 如需查詢子句的詳細資料,請參閱本主題中稍後說明的<Visual Basic LINQ 查詢運算子>一節。 例如,下列查詢會將客戶資料的來源集合識別為 customers 變數,以及名為 cust 的反覆運算變數。
Dim customers = GetCustomers()
Dim queryResults = From cust In customers
For Each result In queryResults
Debug.WriteLine(result.CompanyName & " " & result.Country)
Next
' Output:
' Contoso, Ltd Canada
' Margie's Travel United States
' Fabrikam, Inc. Canada
此範例本身即是有效的查詢,但是,查詢在您加入更多查詢子句以限定結果時會更加強大。 例如,您可以加入 Where 子句,以一個或多個值來篩選結果。 查詢運算式是單行程式碼,您可以在查詢結尾直接加上其他查詢子句。 您也可以將查詢斷成多行文字以加強可讀性,方法是使用底線 (_) 行接續字元 (Line-Continuation Character)。 下列程式碼範例顯示包含 Where 子句的查詢範例。
Dim queryResults = From cust In customers
Where cust.Country = "Canada"
另一個強大的查詢子句是 Select 子句,可以讓您從資料來源只傳回選取的欄位。 LINQ 查詢會傳回強型別物件的可列舉集合。 查詢可以傳回匿名型別或具名型別的集合。 您可以使用 Select 子句,從資料來源只傳回單一欄位。 進行這項查詢時,所傳回的集合型別會是該單一欄位的型別。 您也可以使用 Select 子句從資料來源傳回多個欄位。 進行這項查詢時,所傳回的集合型別會是新的匿名型別。 您也可以比對查詢傳回的欄位與所指定具名型別的欄位。 下列程式碼範例顯示的查詢運算式會傳回匿名型別的集合,該集合中的成員具有從資料來源之選定欄位所填入的資料。
Dim queryResults = From cust In customers
Where cust.Country = "Canada"
Select cust.CompanyName, cust.Country
LINQ 查詢也可以用來組合多個資料來源並傳回單一結果。 這可以用一個或多個 From 子句來完成,或者使用 Join 或 Group Join 查詢子句來完成。 下列程式碼範例顯示的查詢運算式會組合客戶和訂單資料,並傳回包含客戶和訂單資料之匿名型別的集合。
Dim customers = GetCustomers()
Dim orders = GetOrders()
Dim queryResults = From cust In customers, ord In orders
Where cust.CustomerID = ord.CustomerID
Select cust, ord
For Each result In queryResults
Debug.WriteLine(result.ord.Amount & " " & result.ord.CustomerID & " " & result.cust.CompanyName)
Next
' Output:
' 200.00 1 Contoso, Ltd
' 300.00 1 Contoso, Ltd
' 100.00 2 Margie's Travel
' 600.00 3 Fabrikam, Inc.
' 800.00 3 Fabrikam, Inc.
您可以使用 Group Join 子句建立包含客戶物件集合的階層式查詢結果。 每個客戶物件都有一個屬性,用來包含該客戶所有訂單的集合。 下列程式碼範例顯示的查詢運算式會將客戶和訂單資料組合為階層式結果,並且傳回匿名型別的集合。 查詢會傳回包含 CustomerOrders 屬性的型別,該屬性包含客戶訂單資料的集合。 它也包含 OrderTotal 屬性,其中包含該客戶所有訂單的總和 (此查詢相當於 LEFT OUTER JOIN)。
Dim customers = GetCustomers()
Dim orders = GetOrders()
Dim queryResults = From cust In customers
Group Join ord In orders On
cust.CustomerID Equals ord.CustomerID
Into CustomerOrders = Group,
OrderTotal = Sum(ord.Amount)
Select cust.CompanyName, cust.CustomerID,
CustomerOrders, OrderTotal
For Each result In queryResults
Debug.WriteLine(result.OrderTotal & " " & result.CustomerID & " " & result.CompanyName)
For Each ordResult In result.CustomerOrders
Debug.WriteLine(" " & ordResult.Amount)
Next
Next
' Output:
' 500.00 1 Contoso, Ltd
' 200.00
' 300.00
' 100.00 2 Margie's Travel
' 100.00
' 1400.00 3 Fabrikam, Inc.
' 600.00
' 800.00
有數個額外的 LINQ 查詢運算子可以用來建立強大的查詢運算式。 本主題下一章節會討論您可以納入查詢運算式中的各種查詢子句。 如需 Visual Basic 查詢子句的詳細資料,請參閱查詢 (Visual Basic)。
Visual Basic LINQ 查詢運算子
System.Linq 命名空間和其他支援 LINQ 查詢之命名空間中的類別,所包含的方法可讓您根據應用程式的需求而進行呼叫,以建立並限定查詢。 Visual Basic 含有最常見查詢子句的關鍵字,如下表所示。
如需 Visual Basic 查詢子句的詳細資料,請參閱查詢 (Visual Basic)。
您可以使用額外的 LINQ 查詢功能,方法是呼叫 LINQ 提供之可列舉和可查詢型別的成員。 您可以在查詢運算式的結果上呼叫特定的查詢運算子,以使用這些額外功能。 例如,下列程式碼範例會使用 Union 方法將兩個查詢的結果組合成一個查詢結果。 它使用 ToList<TSource> 方法,以泛型清單傳回查詢結果。
Public Function GetAllCustomers() As List(Of Customer)
Dim customers1 = From cust In domesticCustomers
Dim customers2 = From cust In internationalCustomers
Dim customerList = customers1.Union(customers2)
Return customerList.ToList()
End Function
如需 LINQ 其他功能的詳細資訊,請參閱標準查詢運算子概觀。
使用 LINQ to SQL 連接到資料庫
在 Visual Basic 中,您需識別要使用 LINQ to SQL 檔案存取的 SQL Server 資料庫物件,例如表格、檢視及預存程序。 LINQ to SQL 檔案具有 .dbml 副檔名。
當您有效連接至 SQL Server 資料庫時,可以將 [LINQ to SQL 類別] 項目範本加入至專案。 如此就會出現物件關聯式設計工具 (O/R 設計工具)。 您想在程式碼中存取的項目,可以透過 O/R 設計工具從 [伺服器總管]/[資料庫總管] 拖曳至設計工具介面。 LINQ to SQL 檔案會將 DataContext 物件加入至專案。 此物件包含您要存取之表格和檢視的屬性與集合,以及您要呼叫之預存程序的方法。 將變更儲存到 LINQ to SQL (.dbml) 檔案之後,您就可以在程式碼中存取這些物件,方法是參考 O/R 設計工具所定義的 DataContext 物件。 專案的 DataContext 物件是根據 LINQ to SQL 檔案的名稱命名的。 例如,名為 Northwind.dbml 的 LINQ to SQL 檔案,會建立名為 NorthwindDataContext 的 DataContext 物件。
如需有逐步指示的範例,請參閱 HOW TO:使用 LINQ 查詢資料庫 (Visual Basic) 與 HOW TO:使用 LINQ 呼叫預存程序 (Visual Basic)。
支援 LINQ 的 Visual Basic 功能
Visual Basic 還有其他值得注意的功能,可以讓 LINQ 的使用更容易,並減少執行 LINQ 查詢所需撰寫的程式碼數量。 這些需求包括下列各項:
匿名型別:可以讓您根據查詢結果建立新的型別。
隱含型別變數:可以讓您延後指定型別並且讓編譯器 (Compiler) 根據查詢結果推斷型別。
擴充方法:可以讓您以自己的方法擴充現有型別,而不用修改型別本身。
如需詳細資訊,請參閱支援 LINQ 的 Visual Basic 功能。
執行延後與立即查詢
執行查詢與建立查詢是分開的程序。 建立查詢之後,需由另一個機制觸發其執行。 查詢可以在定義之後馬上執行 (「立即執行」(Immediate Execution)),或者先儲存好定義再於稍後執行 (「延後執行」(Deferred Execution))。
根據預設,當您建立查詢時,查詢本身不會立即執行。 相反地,查詢定義會儲存在用來參考查詢結果的變數中。 稍後在程式碼中存取如 For…Next 迴圈 (Loop) 的查詢結果變數時,便會執行查詢。 這個程序稱為「延後執行」(Deferred Execution)。
查詢也可以在定義時執行,稱為「立即執行」(Immediate Execution)。 若要觸發立即執行,您可以在查詢結果的個別項目上套用需要存取權限的方法。 這可以是包含彙總函式,例如 Count、Sum、Average、Min 或 Max 的結果。 如需彙總函式的詳細資訊,請參閱Aggregate 子句 (Visual Basic)。
使用 ToList 或 ToArray 方法也會強制立即執行。 這在您要立即執行查詢並快取結果時相當有用。 如需這些方法的詳細資訊,請參閱轉換資料型別。
如需查詢執行的詳細資訊,請參閱撰寫第一個 LINQ 查詢 (Visual Basic)。
Visual Basic 中的 XML
Visual Basic 中的 XML 功能包含 XML 常值和 XML 軸屬性,可以讓您輕易地建立、存取、查詢及修改程式碼中的 XML。 XML 常值可以讓您在程式碼中直接撰寫 XML。 Visual Basic 編譯器會將 XML 視為第一級資料物件。
下列程式碼範例顯示如何建立 XML 項目、存取其子項目和屬性 (Attribute),以及使用 LINQ 查詢項目的內容。
' Place Imports statements at the top of your program.
Imports <xmlns:ns="http://SomeNamespace">
Module Sample1
Sub SampleTransform()
' Create test by using a global XML namespace prefix.
Dim contact =
<ns:contact>
<ns:name>Patrick Hines</ns:name>
<ns:phone ns:type="home">206-555-0144</ns:phone>
<ns:phone ns:type="work">425-555-0145</ns:phone>
</ns:contact>
Dim phoneTypes =
<phoneTypes>
<%= From phone In contact.<ns:phone>
Select <type><%= phone.@ns:type %></type>
%>
</phoneTypes>
Console.WriteLine(phoneTypes)
End Sub
End Module
如需詳細資訊,請參閱Visual Basic 中的 XML。
相關資源
主題 |
描述 |
描述 Visual Basic 中的 XML 功能,這些功能可讓您進行查詢,並可將 XML 納入 Visual Basic 程式碼中的第一級資料物件。 |
|
提供 Visual Basic 中可用之查詢子句的相關參考資訊。 |
|
包含 LINQ 的一般資訊、程式設計指引及範例。 |
|
包含 LINQ to SQL 的一般資訊、程式設計指引及範例。 |
|
包含 LINQ to Objects 的一般資訊、程式設計指引及範例。 |
|
包含 LINQ to ADO.NET 的一般資訊、程式設計指引和範例。 |
|
包含 LINQ to XML 的一般資訊、程式設計指引及範例。 |
HOW TO 和逐步解說主題
HOW TO:使用 LINQ 查詢資料庫 (Visual Basic)
HOW TO:使用 LINQ 呼叫預存程序 (Visual Basic)
HOW TO:使用 LINQ 修改資料庫中的資料 (Visual Basic)
HOW TO:使用 Joins 以 LINQ 合併資料 (Visual Basic)
HOW TO:使用 LINQ 排序查詢結果 (Visual Basic)
HOW TO:使用 LINQ 篩選查詢結果 (Visual Basic)
HOW TO:使用 LINQ 統計、加總或平均資料 (Visual Basic)
HOW TO:使用 LINQ 尋找查詢結果中的最小或最大值 (Visual Basic)
Walkthrough: Creating LINQ to SQL Classes (O/R Designer)
How to: Assign Stored Procedures to Perform Updates, Inserts, and Deletes (O/R Designer)
精選書籍章節
Programming Visual Basic 2008 的 Chapter 17: LINQ
請參閱
工作
概念
Visual Basic 中的 LINQ to XML 概觀
DataContext Methods (O/R Designer)