LINQ to SQL查詢分析
在向大家詳細介紹LINQ to SQL查詢之前,首先讓大家了解下LINQ to SQL查詢數(shù)據(jù)庫中的數(shù)據(jù),然后全面介紹LINQ to SQL查詢。
LINQ to SQL查詢數(shù)據(jù)庫中的數(shù)據(jù)
1. 雖然數(shù)據(jù)連接已經被確定并建立,但事實上,在一個查詢被執(zhí)行之前,沒有任何數(shù)據(jù)會被接收。這被稱為 lazy(遲緩的)加載或者是 deferred evaluation.(延遲執(zhí)行),它們在大部分場景中將提高效率。下面代碼所包含的查詢將尋找倫敦的客戶:
- Sub Main()
- '使用標準的數(shù)據(jù)連接字符串
- 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 特性,它將允許你依靠編譯器推斷集合數(shù)據(jù)類型。特別是當查詢將返回一個復合的多屬性類型時,這將是一個尤其有用的特性,編譯器將自動推斷實際的類型而不需要額外的定義操作。
2. 增加下列代碼以執(zhí)行并輸出結果:
- Sub Main()
- '使用標準的數(shù)據(jù)連接字符串
- 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查詢將僅僅在代碼需要獲取實際數(shù)據(jù)時才被執(zhí)行。在那一時刻,一條相應的 SQL 命令被執(zhí)行并且建立了相應的對象。這個概念被稱之為“延遲執(zhí)行”,它使查詢能夠冷靜地評估并僅當需要結果的情況下才執(zhí)行 SQL 命令——當即執(zhí)行將有大量的往返損耗與不必要的對象化開銷。
3. 按下F5以調試整個解決方案
4. 按下 ENTER,退出該程序。
調用 Console.ReadLine 方法的目的是防止控制臺窗口在執(zhí)行完畢后立即消失。在以后的步驟中,這一步并不一定都需要。
你將會看到像這個窗口一樣的控制臺窗口:
屏幕上的第一個部分展示了 Linq 生成并發(fā)送 SQL 命令到數(shù)據(jù)庫的全過程。緊接著,你可以看到我們的查詢返回的數(shù)據(jù)。需要注意的是,從數(shù)據(jù)庫中接收的行將被轉換為“真正的” CLR 對象,這將在調試器中被證實。
【編輯推薦】

















