為什麼需要LINQ ?

摘要:為什麼需要LINQ ?

 

轉自http://www.kangting.tw/2008/01/linq_15.html

 

為什麼需要LINQ ? 我的一些想法

 
LINQ 新書工作室還在寫,不過,我一直遇到很多人提到這個問題,「我們為什麼還需要LINQ ? SQL已經夠好了不是嗎」,事實上,在我去年第一次接觸 LINQ 的時候,腦海裏浮現的也是這個問題,資料庫技術發展這麼多年了,沒有人會懷疑 SQL 的威力,直覺、好用,最重要的是,它已經是所有關聯式資料庫的存取標準了,還有,太多人已經熟悉這門技術,究竟為了什麼,我們還需要新的資料存取技術。

我想,是該好好釐清一下這個問題,畢竟,沒有足夠動機,讓技術人員想要學習LINQ,我的書怎麼會賣得好(路人甲:扯東扯西原來為了賣書啊 …)-.-|||。

會讓第一次接觸 LINQ 的技術人員有上面的疑問,最主要的原因在於,幾乎每一個接觸 LINQ 的技術人員被灌輸的第一印象便是,LINQ 是一種可以用來存取物件、資料庫以及XML等等不同資料來源的新技術,這些是事實,但不是重點。

MS發展 LINQ 一定有它的用意。

一個已經成為標準而且被廣泛應用的技術-例如 HTML,就算它不夠好,基本上已經很難被取代,更何況 SQL 本身是一項非常成功的技術,如果 LINQ 只是一個單純的替代品,我想沒有人會想要放棄 SQL 去用它,XML亦是如此,儘管它沒有統一的存取方法,但是各種主流的開發框架,對於XML亦早已提供了完整的支援,我想也沒有人會想要放棄這些已經熟悉的 API 再去學 LINQ,只為了作同樣的事,我這個小小的電腦書作者都知道了,匯集了全球頂尖人才的MS怎麼會不知道 ??

所以,重點不在於LINQ可以存取這些資料來源,LINQ 真正的精神,在於它終於正視了集合物件元素的存取操作這件事。

電腦這門行業之所以稱為資訊工業,在於它是人類為了處理資料而發展出來的一門技術,資料只有經過有效的整理歸納與萃取之後,才能成為有用的資訊,我們所開發的軟體,都是為了處理各種資料而設計,而為了應付資料處理的需求,所以有了資料庫,有了XML文件,然後有了存取這些資料來源的相關的技術。

回到源頭,早期程式語言剛開始發展出來的時候,並沒有上述談到的這些東西,最早期的資料處理,一般均透過所謂的陣列與集合進行操作,一直到現在,只要資料被載入記憶體處理,我們所依賴的依然是這些技術。

瞭解問題在那裏了嗎,集合,長久以來,一直沒有足夠「好」的技術,可以針對儲存在集合中的元素執行存取維護作業,.NET 2.0導入了對泛型的支援,也僅是讓資料的存取更為嚴謹靈活,如此而已,一直到LINQ,這個問題終於有了好的解答。

你很難想像,將集合物件當作資料庫來操作,無論是篩選、計量、關聯或是切割等資料操作,這些 SQL 的基本功能,傳統的程式語言都很難、或是不容易在集合身上辦到,LINQ 為我們提供了一套出色的解決方案。

你可以將 LINQ 視為一套專門用來對付集合物件的資料操作語法,想像有了LINQ,只要將資料儲存於集合,就可以如同資料庫一般進行操作,例如,你可以載入硬碟檔案系統資訊,與資料庫中的資料透過 LINQ 合併作處理,多麼美好的技術,不是嗎。

即然對於集合物件元素的存取有了好的方案,SQL 與 XML 同時一併納入處理最大的好處,是可以在原有的基礎上,提供更好的資料整合能力,而非我們原先認為的,LINQ 的出現只是為了取代這些技術,相反的,它可以讓我們更有效的處理各種不同來源的資料,而當你只是要針對特定的資料來源進行存取,原來的技術還是可以運作的很好。

 

*********************************************************************************

問:

目前在市面上看到新出來的新書,
像 Visual C# 2010、Visual Basic 2010、ASP.NET 4.0.....,雖然都有談到LINQ,但只是當作一個章節在教授,在存取資料時,都還是 

SELECT * FROM ....., 
INSERT INTO(....) VALUES(....)

連作者都還是依循過去的SQL,並不使用LINQ,這是為什麼呢?

 

答:

 

因為 LINQ 本來就不是用來存取資料呀,它跟資料庫沒有關係,它的用途支援前端資料的運算處理。

應用程式處理資料有兩個階段:

第一個階段:將資料從資料庫取出。
第二個階段:針對取出的資料進行處理。

SQL 用在第一個階段,LINQ 則是第二個階段。

所以任何與資料庫有關的互動都必須透過 SQL 來作,包含資料查詢、更新異動等等。

但資料取出來之後要進一步運算,或是與資料庫無關的資料處理,包含集合、陣列的複雜運算就可以交給LINQ 了,所以 你會看到 LINQ沒有所謂的更新之類的語法。