摘要:使用LINQ to SQL (第一部分)(韓現龍譯)
【原文位址】Using LINQ to SQL (Part 1)
【原文發表日期】 Saturday, May 19, 2007 12:41 AM
在過去的幾個月中我寫了一系列涵蓋了VS和.NET Framework Orcas版中的一些新特性的文章,下面是這些文章的連結:
以上的語言特性幫助資料查詢成為一等程式設計概念。我們稱這個總的查詢程式設計模型為「LINQ」--它指的是.NET語言級整合查詢。
開發者可以在任何的資料源上使用LINQ。他們可以在他們選擇的程式設計語言中表達高效的查詢行為,選擇將查詢結果轉換或構形成他們想要的任何格式,然後非常方便地操作這個結果集。有LINQ功能的語言可以提供完全的型別安全和查詢運算式的編譯時檢查,而開發工具則可以提供在編寫LINQ程式碼時完全的intellisense,偵錯,和豐富的重構支援。
LINQ支援一個非常豐富的的擴展性模型,該模型將有助於對不同的資料源生成不同的高效運算因子(domain-specific operators)。.NET Framework的Orcas版本將發佈一些內建庫,這些庫提供了針對物件(Objects),XML,和資料庫的LINQ支援。
什麼是LINQ to SQL?
LINQ to SQL 是隨.NET Framework Orcas版一起發佈的O/RM(物件關係映射)實現,它允許你用.NET 的類來對一個關係型資料庫建模。然後你可以用LINQ對資料庫進行查詢,以及進行更新/插入/刪除資料的操作。
LINQ to SQL完全支援事務,視圖和預存程式。它還提供了一種把資料驗證和業務邏輯規則結合進你的資料模型的便利方式。
使用LINQ to SQL對資料庫建模:
Visual Studio Orcas版中提供了一個LINQ to SQL設計器,該設計器提供了一種簡易的方式,將資料庫可視化地轉換為LINQ to SQL物件模型。我下一篇部落格將會更深入一些來介紹怎麼使用該設計器(你可以觀看我一月份時錄製的這個關於如何從頭開始建立LINQ to SQL模型的錄影)。
通過LINQ to SQL設計器,我可以方便地設計出如下所示的Northwind資料庫的範例模型:
上圖定義了四個實體類別:Product, Category, Order 和 OrderDetail。每個類別的屬性都映射到資料庫中相應表的欄位,類別實體的每個實例代表了資料表中的一行記錄。
在上圖中,四個實體類別間的箭頭代表了不同實體間的關聯/關係。它們主要是根據資料庫中的主鍵/外鍵關係生成的。設計器上的箭頭的指向表明了該關係是一對一還是一對多的關係。基於此,強型別的屬性將會被加入到實體類別中。例如,上邊的Category類和Product類之間有一個「一對多」的關係。這意味著Category類別將有一個」Products」屬性,該屬性代表了在該類別中所有的產品對象的集合。而Product類別將會有一個 Category 屬性來指向一個Category類別的實例,該Category類別的實例表明了了產品所屬的類別。
上圖中LINQ to SQL設計器的右側列出了與我們的資料庫模型交互的預存程式。在上邊的例子中,我添加了一個「GetProductsByCategory」預存程式。它有一個categoryID作為輸入參數,傳回一個產品實體序列作為結果集。下面的程式碼將展示如何叫用該預存程式。
理解DataContext類別
當你點擊LINQ to SQL設計器上的「保存」按鈕時,Visual Studio將會保存我們建立的代表了實體和資料庫關係的各個類別。針對加入到我們的解決方案的每一個LINQ to SQL設計器文件,同時也會生成一個自訂的DataContext類別。這個DataContext類別是我們從資料庫中查詢實體或者進行更改操作的主要渠道。生成的DataContext類將含有一些屬性,對應於我們在資料庫中建了模的每個資料表,以及一些方法,對應於我們添加的每個預存程式。
例如,下圖就是基於我們上邊設計的模型而生成的的NorthwindDataContext類別:
LINQ to SQL 程式碼例子
用LINQ to SQL 設計器對我們的資料庫建模之後,我們就可以很方便地編寫程式碼對資料庫進行操作了。下邊是一些展示了常見的資料庫操作的程式碼例子:
1) 從資料庫中查詢Products
下面的程式碼用LINQ to SQL 查詢語法來獲取Product物件的IEnumerable序列。注意程式碼是如何通過Product/Category關係來僅查出那些類別是 Beverages 的產品的:
C#:
VB:
2) 更新資料庫中的一條產品記錄
下面的程式碼示範了如何從資料庫中查詢出單一的一條產品記錄,更新它的價格,然後將改動保存至資料庫:
C#:
VB:
注意:VB在Orcas Beta1中尚不支援Lambda。但是在Beta2中,它就會支援了--那時程式碼就會能寫得更為簡潔一些。
3) 向資料庫中插入一條新的Category和兩條新的Products
下面的程式碼示範了如何生成一個新的分類,然後生成兩條和該分類相關聯的產品,然後將這三條記錄保存到資料庫中。
注意下邊,我不用手工去維護主/外鍵關係,取而代之的是,我只向分類對象的「Products」集合中添加了兩個Product記錄,然後把該Category物件添加到DataContext的「Categories」集合中,LINQ to SQL將知道自動為我持久適當的PK/FK的關係。
C#
VB:
4) 從資料庫中刪除Products
下面的程式碼示範了如何從資料庫中刪除所有的玩具產品:
C#:
VB:
5) 叫用預存程式
下面的程式碼示範了如何不使用LINQ查詢語法,而是通過叫用我們在上面向資料模型中添加的「GetProductsByCategory」預存程式來查詢Product實體。注意,一旦我查詢出了Product結果集,我可以更新/刪除它們,然後再叫用 db.SubmitChanges()來將這些更新提交到資料庫。
C#:
VB:
6) 在伺服端分頁查詢Products
下面的程式碼示範了如何通過LINQ查詢語法實現高效的伺服端資料庫分頁查詢。通過使用下面的Skip()和Take()運算子,我們從資料庫中只查詢出從200行開始的10條記錄:
C#:
VB:
總結
LINQ to SQL提供了一種很棒的、乾淨利索的方法來為你的應用程式來建立資料層。一旦你定義了資料模型,你就可以方便而且有效地對它進行查詢,插入,更新和刪除。
希望以上的介紹和程式碼例子刺激了你的胃口,希望瞭解到更多東西。在接下來的幾周裡我會在該系列中更具體地探討LINQ to SQL。
希望本文對你有所幫助,
Scott