LINQ to SQL查詢分析
在向大家詳細介紹LINQ to SQL查詢之前,首先讓大家了解下LINQ to SQL查詢數據庫中的數據,然后全面介紹LINQ to SQL查詢。
LINQ to SQL查詢數據庫中的數據
1. 雖然數據連接已經被確定并建立,但事實上,在一個查詢被執行之前,沒有任何數據會被接收。這被稱為 lazy(遲緩的)加載或者是 deferred evaluation.(延遲執行),它們在大部分場景中將提高效率。下面代碼所包含的查詢將尋找倫敦的客戶:
- Sub Main()
- '使用標準的數據連接字符串
- Dim db As DataContext
- db = New DataContext("Data Source=."sqlexpress; Initial Catalog=Northwind")
- '獲取一個用于進行強類型查詢的 Table 對象
- Dim Customers As Table(Of Customer)
- Customers = db.GetTable(Of Customer)()
- '將包含具體 SQL 的,LINQ to SQL 生成的日志顯示到控制臺窗口
- '這僅僅用于調試或理解Linq to Sql是如何工作的
- db.Log = Console.Out
- '查詢倫敦的客戶
- Dim custs = From customer In Customers _
- Where customer.City = "London" _
- Select customer
- End Sub
這個LINQ to SQL查詢將返回所有來自倫敦的定義于 Customers 表中的客戶。它被定義為查詢表達式語法,編譯器將把它編譯為清晰的方法調用語法。同時請注意到,custs 集合的類型并沒有被定義,這是一個非常便利的 Visual Basic 9.0 特性,它將允許你依靠編譯器推斷集合數據類型。特別是當查詢將返回一個復合的多屬性類型時,這將是一個尤其有用的特性,編譯器將自動推斷實際的類型而不需要額外的定義操作。
2. 增加下列代碼以執行并輸出結果:
- Sub Main()
- '使用標準的數據連接字符串
- Dim db As DataContext
- db = New DataContext("Data Source=."sqlexpress; Initial Catalog=Northwind")
- '獲取一個用于進行強類型查詢的 Table 對象
- Dim Customers As Table(Of Customer)
- Customers = db.GetTable(Of Customer)()
- '將包含具體 SQL 的,LINQ to SQL 生成的日志顯示到控制臺窗口
- '這僅僅用于調試或理解Linq to Sql 是如何工作的
- db.Log = Console.Out
- 'Query for customers in London
- Dim custs = From customer In Customers _
- Where customer.City = "London" _
- Select customer
- For Each cust In custs
- Console.WriteLine("ID={0}, City={1}", cust.CustomerID, cust.City)
- Next
- Console.ReadLine()
- End Sub
這些LINQ to SQL查詢將僅僅在代碼需要獲取實際數據時才被執行。在那一時刻,一條相應的 SQL 命令被執行并且建立了相應的對象。這個概念被稱之為“延遲執行”,它使查詢能夠冷靜地評估并僅當需要結果的情況下才執行 SQL 命令——當即執行將有大量的往返損耗與不必要的對象化開銷。
3. 按下F5以調試整個解決方案
4. 按下 ENTER,退出該程序。
調用 Console.ReadLine 方法的目的是防止控制臺窗口在執行完畢后立即消失。在以后的步驟中,這一步并不一定都需要。
你將會看到像這個窗口一樣的控制臺窗口:
屏幕上的第一個部分展示了 Linq 生成并發送 SQL 命令到數據庫的全過程。緊接著,你可以看到我們的查詢返回的數據。需要注意的是,從數據庫中接收的行將被轉換為“真正的” CLR 對象,這將在調試器中被證實。
【編輯推薦】