【第157期 October 5, 2010】
 

研發新視界

淺談LINQ(Language-Integrated Query)

作者/張維峻

[發表日期:2010/9/24]




前言

談到LINQ,或許還有許多人覺得很陌生,它是微軟自.NET Framework 3.5開始所導入的一種新的資料存取技術,能夠讓使用者透過一致的方法,去存取處於各種形態資料來源中的資料。

技術說明

LINQ具備了兩個重要的特質,第一,具備Query能力,第二,與語言進行整合。主要分成如下四大類,架構大致上如圖一所示:

1. LINQ to Object
2. LINQ to XML
3. LINQ to DataSet
4. LINQ to SQL (不過似乎已逐漸被Entity Framework所取代)


《圖一》LINQ架構圖


Enumerable 與 IEnumerable

在我們所建立的每個LINQ查詢中,Enumerable類別扮演著一個重要的角色,此類別提供了標準的查詢運算實作,此類別中大部份的方法都定義成用來擴充 IEnumerable的擴充方法(Extension Method),換句話說,只要是實作IEnumerable介面的物件,皆可做為LINQ to Object的資料來源,而使用LINQ去做運算。舉個例子,像我們所常用的Array,也實作了IEnumerable的介面,因此我們可使用LINQ來對Array做相關的處理。

Lambda Expression

Lambda運算式(Lambda Expression) 是一種匿名的函式,它可以包含運算式(expression)與陳述式(statement),並且可以用它來建立Delegate與Expression Tree型別。

Delegate型別:



Expression Tree型別:



Anonymous Type

在很多時候宣告LINQ或者是匿名型別的語法時,並無法事先知道型別,或者是不需要知道型別。由匿名型別所宣告之變數或物件,其型別將隨著LINQ或者匿名型別的語法宣告而動態變換型別。



實例介紹

以下舉一個實際以LINQ做查詢的例子:



透過以上LINQ指令,使得查動作變得非常簡單,省去許多IF-ELSE判斷,查詢出來的結果,只需要一個for-each迴圈就能處理完想處理的資料,也使得程式碼變得比較簡潔明瞭。

結語

當專案需要使用到大量的資料查詢時,其中可能包含對許多資料表的連結與條件與條件的判斷。而當資料表數量越多越大、SQL下得越複雜時,勢必會拖慢系統反應速度。但因為通常SQL Server只會有一台,而後端Server可能會有多台,我們可以將資料中複雜運算邏輯的部份分攤到各個Server中做處理,而SQL Server只單純做簡單的查詢動作,因此可大大減低SQL Server的Loading,可以使SQL Server達到更有效的運用;另外在處理資料的時候,LINQ能夠以貼近SQL語言的方式,簡單處理大量資料,而不需使用複雜的程式去做處理,一個簡單的例子如下:要過濾一個集合中重復出現的元素,只需要使用一個簡單的 Distict() 的method,就可以以簡短的程式碼,取代以往所需要的一連串判斷手續,藉以加快開發速度。

參考資料

MSDN
Wikipedia