關於 LINQ

LINQ 系列 

LINQ 根基於 .NET 2.0 的幾個重要基礎發展而來,如果你要學習LINQ,先確認你已經有了這些基礎,否則,先補齊必要的知識再學習標準的LINQ 語法。

學習 LINQ 技術必須先瞭解的幾種技術如下:
  • 泛型
  • 匿名方法
  • 列舉與 Yield 
  • 委派機制
瞭解以上的內容,就可以開始進入LINQ 學習。LINQ 可能最具傳奇色彩的資料存取技術,它最早是.NET 平台針對泛型集合物件發展出來的一組擴充方法,搭配類 SQL 敘述,成功的讓程式語言可以直接對集合資料進行各種複雜的資料運算,就如同 SQL 敘述對關聯式資料所作的事一樣。

爾後,LINQ 不斷的擴充至各種類型的資料架構,讓她的可用性幾乎到了無所不查的境界了,下圖大約列舉 LINQ 目前比較主要的各種對應技術。


其中 Entity Framework 是一項最重要的應用,而 LINQ 目前已經成為.NET 平台最重要的資料運算技術了,特別是如果你使用 ASP.NET 的技術,它可以被套用在目前的幾種型式開發環境中,而在這些場合,也是被大量使用的技術。

LINQ 與 SQL 有些類似,以下是最基本的語法結構:

IEnumerable<int> enumQuery =
    from 
    where 
    select … ;

來看一個基本範例,建立主控台應用程式,於其中的 Main 方法裏輸入以下的內容:

string[] countrysQuery = {
                "Taiwan", "China",
                "America", "England" };

IEnumerable<string> enumContrys =
                from contry in countrysQuery
                where contry == "Taiwan"
                select contry;

string source = "原始字串:";
foreach (string contry in countrysQuery)
 {
    source += contry + ",";
 }
Console.WriteLine(source);
foreach (string contry in enumContrys)
{
    Console.WriteLine("搜尋結果:" + contry);
}

從 countrysQuery 這個字串陣列物件當中,取得字串內容等於「Taiwan」的集合元素,然後透過一個 foreach 迴圈,逐一將取得的內容輸出於畫面上,為了方便比較透過另外一個foreach迴圈,列出原始陣列內容。

原始字串:Taiwan,China,America,England,
搜尋結果:Taiwan


為什麼需要LINQ

LINQ 是 .NET 3.5 導入的一種新的資料存取技術,這個技術可以讓開發人員透過一致的方法,存取各種型態的資料來源。

.NET 2.0導入了對泛型的支援,LINQ 在泛型基礎上,從集合類型資料的搜尋功能出發,逐步發展為支援物件、資料庫、XML以及實體資料等等不同資料來源的新技術。

針對集合類型資料的操作,無論是篩選、計量、關聯或是切割等等,LINQ 為我們提供了一套出色的解決方案。

你可以將 LINQ 視為一套專門用來對付集合類型資料的搜尋操作語法,只要將資料儲存於集合,就便可以如同資料庫一般進行操作,例如,你可以載入硬碟檔案系統資訊,與資料庫中的資料透過 LINQ 合併作處理。

有了 LINQ ,我們可以針對關聯式資料庫或是  XML 等各種不同結構的資料統一以 LINQ 進行處理,在原有的基礎上提供更好的資料整合能力,更有效率的處理各種不同來源的資料,而當你只是要針對特定的資料來源進行存取,原來的技術還是可以運作的很好。

LINQ 優勢-與 C# 語言整合

當你需要查詢一些特定資料的時候,例如,某個書籍資料表 Book 裏面的書籍資料,所需的語法如下:

SELECT * FROM Book

其中,Book是資料表,「*」代表回傳所有的資料欄位,這一段SQL被送回伺服器作解譯,然後回傳取得的資料內容。現在我要進一步的萃取其中某些資料,例如,代表書籍名稱的 BookTitle 欄位,語法如下:

SELECT BookTitle FROM Book

如果要查詢BookTitle欄位所儲存的書籍名稱中有 「ASP.NET」 的,則需要 LIKE:

SELECT BookTitle FROM Book WHERE BookTitle LIKE '%ASP.NET%'


要在 LINQ 實現 LIKE 功能,所需的語法如下:

var enumQuery =
    from book in db.Book
    
    where book.BookTitle.Contains("ASP.NET")    
    select book

這段語法可以讓我們萃取出等同於上述LIKE語法的所回傳的內容資料,相較於 SQL 的好處,至少有兩點:
  • 物件化導向的寫法,db代表資料庫實體,book為其屬性,它回傳一個對應底層Book資料表的Entity類別,然後資料表的欄位,直接透過book這個變數進行引用即可存取。
  • 完全整合進C#,如你所見,不用去拼湊SQL,只要透過C#,就能萃取所要的資料內容,聰明的讀者可能想到了,即然可以這樣玩,是否代表著我們可以利用字串本身的功能,作單一欄位內容的資料萃取?答案是對的。
上述的語法,LINQ 會自動轉換成為對應的SQL,有了 LINQ to SQL ,你將不需要再去拼湊SQL,所有的資料表都是物件,所有的資料表欄位,都是物件的屬性,你甚至可以直接寫一個欄位驗證函式,再將這個函式嵌入LINQ語法中,例如以下的程式片段:

var enumQuery =    from book in db.Book    
        where Check(book)    
        select book

其中的Check是一個包含了驗證邏輯自訂函式。LINQ之前,SQL 與程式語言只能溝通,無法整合,而LINQ本身就是言語的一部份,資料技術在SQL出現多年之後,現在真正的被融入了程式語言當中,進一步的物件化,以物件導向設計詮釋資料存取技術。


LINQ 系列 》


沒有留言: