舒國軍,黃剛
(遵義師范學院計算機科學系,貴州遵義563002)
LINQ[1](Language Integrated Query——語言集成查詢)是微軟推出的新一代查詢技術,使用.NET Framework3.5和Visual Studio 2008開發環境。LINQ技術有三大組件LINQ to Object、LINQ to ADO.NET和LINQ to XML分別用來訪問集合對象,關系數據庫和XML文檔,其中LINQ to ADO.NET有三種技術,LINQ to DataSet、LINQ to SQL、LINQ to Entities,與.NET語言的關系和架構如圖1所示。
傳統的ADO.NET訪問數據庫的缺陷如下:算法復雜,需要定義查詢字符串,如果字符串錯誤則數據訪問失敗;不能保證綁定的參數與查詢語句中的一致導致運行錯誤;訪問不同的數據庫要編寫不同的SQL語句,代碼一致性和靈活性差;關系數據庫采用的數據模型與編寫代碼的對象模型有差異,開發人員需花時間寫代碼解決“阻抗不匹配”[1]的問題。

LINQ的這幾個組件可訪問不同的數據源,且對不同數據源開發時可用統一的查詢語法,降低了數據庫開發的門檻,提高了開發效率,具有良好的可重用性和擴展性。LINQ實現了Web開發中的三層體系架構的擴展應用,還能實行異步查詢技術來提高應用程序的吞吐量,縮短程序響應時間,減少用戶等待時間。
在數據庫開發領域,面向對象的程序代碼與關系數據庫有差異性,而LINQ to SQL[2]在這兩者間架起了一座橋梁。LINQ to SQL提供了輕量級的對象關系映射框架,將關系數據庫映射為.NET Framework3.5中的一些類,然后對數據進行CRUD操作。LINQ to SQL為數據庫創建對象模型,其中實體類的字段映射列,關系映射主外鍵關系,方法映射存儲過程或函數。LINQ to SQL把以往數據庫應用程序中的操作細節封裝起來,使開發人員更關注核心代碼邏輯。LINQ to SQL層和表示界面層結合,開發效率高,采用三層體系結構[3],如圖2所示。

LINQ to SQL的實體類[4]用于表示對象-關系映射(ORM)。首先準備好數據庫對象,然后建立實體類。建立方法有很多:手動編碼、用XML文件映射、命令行工具SqlMetal生產、LINQ to SQL設計器等。其中VS2008提供的O/R對象關系設計器比較方便使用,有可視化設計界面,用于創建映射到數據庫中表的對象模型,生成強類型DataContext在實體類和數據庫間發送接收數據,對實體類間繼承關系的設計[5]。實體類TabAddress的代碼片段:



(3)LINQ to SQL[7]中的Attach()和AttachAll()方法用來在多層結構的程序中更新數據,將實體附加到數據上下文的數據表,而表示界面層用SubmitChanges()方法來更新數據庫。從數據庫中檢索數據,由于是采用基于表達式樹的查詢機制,要通過對Queryable類的擴展方法完成,如用where()方法來根據條件篩選并返回數據,用Last()方法來返回滿足條件的最后一條記錄等。
SQLMetal是一種VS2008提供的在生成數據模型對象中使用的命令行工具,可以從已經存在的數據庫生成類在LINQ程序中使用,通過這個工具可以執行以下操作:從數據庫生成包含源代碼和映射屬性的文件,生成自定義使用的中間數據庫標記語言文件(*.dbml)等等。另外VS2008還有可視化LINQ代碼編輯器和調試器,為開發人員提供智能代碼提示,支持查詢表達式。
在ASP.NET 3.5的VS2008環境下,在Web應用程序中檢索或修改數據時,通過使用LinqData-Source控件[8]來自動創建與數據進行交互的命令,簡化網頁代碼。LinqDataSource控件與數據庫的數據交互時,不是直接連接到數據庫,而是與表示數據庫和表的實體類交互,通過對象關系設計器或者SQLMetal工具生成實體類。LinqDataSource控件與Sql-DataSource控件相比有很大的優勢,無需設置SQL查詢命令對數據的綁定和操作,LinqDataSource控件將使用LINQ to SQL自動創建,當更新或插入數據時,將DataField屬性與實體類中的屬性名進行匹配即可。頁面通過數據源LinqDataSource控件和顯示數據的GridView控件就可以實現數據的操作[9],控件代碼如下:


本文介紹了LINQ查詢技術中LINQ to SQL架構設計和數據庫操作,LINQ to SQL除了建立數據模型對數據進行CRUD操作(插入,刪除,更新)外,還支持存儲過程、事務、視圖的操作。在Visual Studio 2008中可以用LinqDataSource控件和GridView控件對關系數據庫實現數據操作。作為新一代的數據訪問技術,LINQ是在很多技術的基礎上發展起來的,如C-Omega語言、ObjectSpace以及XQuery等等,LINQ優秀的語法查詢機制對開發人員提高項目效率有很大的現實意義。
[1] 趙王兵.LINQ數據訪問技術的研究及其在電機設計系統中的應用[D].廣東:中山大學,2009.
[2] Paolo Pialorsi,Marco Russo.Programming Microsoft LINQ[M].Redmond:Microsoft Press,2008.467-489.
[3] 史紅軍.快速開發基于Linq to Sql的三層Web應用[J].科技資訊,2009,(24):19-20.
[4] Ken Getz.The LINQ Enumerable Class,Part2[EB/OL].http://msdn.microsoft.com/en-us/Magazine/cc793963.aspx,2011-06-09.
[5] Scott Guthrie.Using LINQ-to-SQL(Part 1)[EB/OL].http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sqlpart-1.aspx,2011-05-07.
[6] 趙志剛.ASP.NET中基于LINQ的數據訪問[J].沈陽師范大學學報(自然科學版),2009,27(2):198-201.
[7] Anthony Sneed.Flexible Data Access With LINQ To SQL And The Entity Framework[EB/OL].http:/msdn.microsoft.com/enus/magazine/dd263098.aspx,2010-06-11.
[8] Matthew MacDonald.Beginning ASP.NET 3.5 in C#2008 Fr om Novice to Professional second edtion[M].Redmond:Apress,2008.577-616.
[9] 王的強.LINQ入門及應用[M].北京:清華大學出版社,2009.209-225.