很多人,包含我自已在內,一開始的時候,總是在想,LINQ to SQL 到底想要幹麻,SQL還不夠用嗎,搜尋功能一應俱全,是呀,的確夠用,如果對於純粹的資料庫本身來說,反觀LINQ to SQL,就那幾個子句,select、from、where、in …連個Like模糊比對功能都找不到,到底 LINQ to SQL 要幹麻?
LINQ to SQL 要幹麻,為什麼要用它 ? 從去年到現在,我一直嘗試想要回答這個問題,不只是說服讀者,更得說服我自已,否則,年後要出版的 LINQ 新書,到底想賣誰?
今天先提一個簡單概念,就是物件,大家可能習慣了SQL,覺得沒什麼不好,當你需要查詢一些特定資料的時候,例如,某個書籍資料表裏面的書籍資料,我們會寫下這樣的語法:
SELECT * FROM Book
其中,Book是資料表,「*」代表回傳所有的資料欄位,這一段SQL被送回伺服器作解譯,然後回傳取得的資料內容,一切都很美好。
好,現在我要進一步的萃取其中某些資料,例如,代表書籍名稱的 BookTitle 欄位,語法如下:
SELECT BookTitle FROM Book
很快的,我又搞定了,不止如此,如果我要查詢BookTitle欄位所儲存的書籍名稱中,有 ASP.NET 的,很簡單,再來一段:
SELECT BookTitle FROM Book WHERE BookTitle LIKE '%ASP.NET%'
搞定了,我用了LIKE。
SQL這麼好用,為什麼再搞一個LINQ to SQL 出來?先來看看上述LIKE,轉換成為LINQ to SQL怎麼寫:
var enumQuery =
from book in db.Book
where book.BookTitle.Contains("ASP.NET")
select book
今天,我還不打算詳細介紹語法,我們來看其中的重點,這段語法可以讓我們萃取出等同於上述LIKE語法的所回傳的內容資料,它的好處,至少有兩點:
- 物件化導向的寫法,db代表資料庫實體,book為其屬性,它回傳一個對應底層Book資料表的Entity類別,然後資料表的欄位,直接透過book這個變數進行引用即可存取。
- 完全整合進C#,如你所見,不用去拼湊SQL,只要透過C#,就能萃取所要的資料內容,聰明的讀者可能想到了,即然可以這樣玩,是否代表著我們可以利用字串本身的功能,作單一欄位內容的資料萃取?答案是對的。
看到它的好處了嗎,上述的語法,.NET會自動轉換成為對應的SQL,有了LINQ to SQL ,你將不需要再去拼湊SQL,所有的資料表都是物件,所有的資料表欄位,都是物件的屬性,你甚至可以直接寫一個欄位驗證函式,再將這個函式嵌入LINQ語法中,例如以下的程式片段:
var enumQuery =
from book in db.Book
where Check(book)
select book
其中的Check是一個自訂函式,你想寫一個多複雜的邏輯函式都沒人管你,反正LINQ to SQL會幫你搞定它。
最後,我要說的是,LINQ之前,SQL是SQL,程式語言是程式語言,它們只能溝通,但無法整合,充其量只是你玩你的,我玩我的,最後再將結果整理出來,而LINQ本身就是言語的一部份,資料庫存取技術在SQL出現多年之後,現在真正的被融入了語言當中,最重要的,它被物件化了,以物件導向設計詮釋資料存取技術,這一點,絕對是資料存取技術發展的一個里程碑,下一篇,我們繼續來談這個所謂的里程碑,待續 …
相關閱讀:「為什麼需要LINQ ? 我的一些想法 」:)

2 意見:
昨天才看了一下網路有關 LINQ 的資料,看了一下,好像感覺是用來讓連資料庫能有更便利更直覺的寫法,不過不知以後的生命會多久~呵呵,微軟常常在推翻自己的東東~
怎麼感覺這舊版都沒學會就又要學新的囉~
不知老師我這樣講對不對!
Hi,呆呆,MS的技術,其他的因為我不懂,所以就不談了,至於.NET,新的功能幾乎都是直接堆疊上來,而非取代,所以說推翻是言過了…
至於LINQ 讓連資料庫能有更便利更直覺的寫法,只是表面上看來的感覺,事實上,它的威力不在這上面,真正的重點在於,LINQ終於將資料存取技術,整個無縫融入語言當中了,詳情,請先看這篇文章,近日,還有更多觀念上的文章會上架,這有助於你在學習LINQ過程中,釐清一些觀點,學習愉快。:)
張貼意見