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