程式語言隨著時間的演進,經過一再沉澱經驗與抽象後,逐漸能以簡練直觀的語法解決具有共通特徵的各式問題。Visual Studio 2008(代號為Orcas)、C# 3.0與VB.NET 9.0將支援新的語法:Language Integrated Query(LINQ),一體解決多樣的資料存取。

何謂LINQ?

LINQ是由C#首席設計師Anders Hejlsberg所主導。他曾打造Turbo Pascal、Delphi、Visual J++、C#等叫好又叫座的產品,單憑這位殺手級應用創造者的眼光,就不可小覷LINQ。

它包含了一系列語言延伸模組,以型別安全的方式支援資料查詢。令人期待的是,LINQ具有隔絕各種資料的特性,不管是各廠家資料庫的SQL方言,或是XML的 DOM、XQuery或XPath,抑或是物件集合的屬性存取,我們可以用共通的方式完成資料操作,如:挑選、比對、排序、彙總等。之所以這麼考量,主要目的是減輕程式開發人員學習操作各種資料的負荷。

藉由各語言編譯器,LINQ將內嵌的LINQ語法轉譯成原本的C#或 VB.NET程式碼,並呼叫相關的底層模組以實體維護資料。由於最後編譯成與.NET Framework 2.0 CLR相容的IL,所以CLR本身並未增加與LINQ相關的模組,但.NET Framework、Visual Studio整合開發環境和程式語言,則需要增加相關功能和語法。

LINQ與SQL各擁一片天整體來說,LINQ有以下的好處:

簡化大量的細節運作:將「如何(How)取得資料」,換成「要操作什麼(What)資料」:這意味著LINQ將存取最佳化交由專家來做,如:由DB引擎來最佳化存取資料。

用統一的方式存取各種資料:舉例來說,檔案系統、作業系統的Process、Registry、物件集合、XML、資料庫等,所用的皆是物件,所有的屬性都是資料。換句話說,存取「資料物件化」以及「物件資料化」兩者的語法與語意都相同。

平行運算:若要處理大量資料,程式設計師不容易撰寫迴圈同時又包含平行運算的程式碼。但LINQ在轉譯成C#或VB.NET的程式碼的同時,也能夠以平行運算的方式處理大量資料。

以IntelliSense和強型別檢查:相較於以往ADO.NET加上SQL語法,LINQ比typed dataset直觀易懂,而且應用更為廣泛。

與許多朋友聊到LINQ時,最頻頻詢問的便是「未來是否不需要學SQL了?」我認為,短時間內並不可能,LINQ或許能減輕程式設計師對SQL的倚賴,但LINQ不會取代SQL。LINQ與SQL各自有一片天。LINQ是程式設計師用的資料物件語言,SQL是資料庫管理師對資料庫引擎溝通的語言;LINQ是從應用程式處理資料的角度出發,但SQL則關係到整體資料庫伺服器能否有效、「安全地活著」的每一個細節。

而緊接的問題通常是:「將資料以物件來包裝,透過entity類別間接存取資料,那是否會發生效率問題?」這有待事實來證明。

從範例看LINQ

你可以在C#中直接內嵌如下的語法,以取得在Customer 物件集合中,每個Customer的屬性Country值為USA,按照City屬性由大到小排序,傳回以CompanyName和City兩個屬性的字串值所建立的新物件集合:

這句LINQ語法經由C#編譯器解析,傳回實作 IEnumerable介面的物件給matchCustomers 變數,而在查詢語法中,呼叫了where、orderby、select等延伸方法(Extension Methods),並定義匿名方法(Anonymous Methods)的委派(delegate);同時要求where方法比較Customers集合中Customer物件的Country屬性值為USA。

換句話說,自動將c.Country == "USA" 轉成 bool Pred(T item) 形式的委派。最後透過select延伸方法搭配物件初始設定式,回傳匿名型別(Anonymous Type)物件的集合。

若不採用 LINQ 寫法,上述語法也可以寫成如下的方式:
「哇!沒想到我修習了.NET數年,竟不知所云?」看完上面的語法,你也許會有這種反應。在此我想介紹一本入門書:《Introducing Microsoft LINQ》。它能讓你了解以往的C#和VB.NET各版本如何漸進地增加功能,最後演變出LINQ語法。

適合對新知充滿好奇的人

本書僅是LINQ的入門介紹,對於實際使用LINQ到資料操作,如與控制項做雙向資料繫結(DataBinding)以維護資料庫內資料、彈性地動態組裝SQL語法等,並沒有明確交代。期待這一部分隨著Orcas步入正式版後,會有簡單且完整的解法。

本書結構短小,僅6章加上一個附錄,各章基本架構就是對應LINQ架構圖的各區塊所設計,附錄則解釋了ADO.NET Entity Framework的架構,以及 Orcas如何產生該架構之下的三種檔案:

● Conceptual Schema Definition Language(CSDL):用來描述程式碼所依據的資料定義。

● Storage Schema Definition Language(SSDL):用來描述實體資料儲存區,如SQL Server對資料庫內各物件的定義。

● Mapping Schema Language(MSL):用來聯繫對應CSDL和SSDL,因此CSDL與SSDL可以多對多對應,也就是資料操作與資料儲存能夠分開。

Orcas參照CSDL會產生出代表資料的實體(entity)物件之C#程式碼,再經由SSDL和MSL結合到資料儲存的實體,如SQL Server。當透過 LINQ操作ADO.NET Entity時,可輕易完成資料維護與交易管理。

本書是為熟悉C#的程式設計師介紹LINQ語法所設計的,因此全書的文字內容並沒有完整的可執行範例,且未與ASP.NET或Windows Form等使用者介面技術整合,但對於LINQ的基本技術介紹得還算完整。由於只有 217頁,逐頁讀完,也就能對LINQ有所了解。但如果你只想熟悉C#或VB.NET,可以在第二、三章中擇一選讀,需要閱讀的分量就更少了。

如果你不熟悉C#,那麼你需要先耐心地了解本文上述所表列C#的各項功能,並反覆閱讀本書,才能漸漸融會貫通。

最後,若你要購買本書,還需要考慮以下問題。由於LINQ目前還是Beta版,明年推出的正式版可能仍有變化;相對於內容分量,本書的價格稍嫌昂貴。也因如此,它在Amazon的評價只有兩顆星。或許,它僅適合買書不需考慮成本,或者對於新知充滿好奇的人。

延伸閱讀

● Anders Hejlsberg對LINQ定位的說明與實際示範
● 作者為本書所建置的網站,提供第一章試閱,以及可下載的範例程式碼
● MSDN上介紹LINQ的文件

 

Introducing Microsoft LINQ

Paolo Pialorsi、Marco Russo/著

Microsoft Press出版

售價:34.99美元

Amazon評價二顆星

 

《作者簡介》

胡百敬

現任職恆逸資訊教育訓練處資深講師,Ascentn、睿智資訊與臺灣微軟技術顧問。著有《SQL Server 2005 T-SQL 資料庫設計》等書,並為專欄作家。

熱門新聞

Advertisement