2012年7月18日 星期三

第一次認識 LINQ

沒錯,幾天前,是我第一次認識LINQ,第一次看到這個詞是幾年前的事情,那時以為是有人想仿效 Maggie Q 取的名字,LinQ…請原諒我的無知。

這半個月每天都為了ASP.NET苦讀MSDN文件,期間一直很想碰碰 LINQ,但知道一碰又是萬丈深淵,就沉住氣,前幾天ASP.NET總算到了自已滿意的進度,可以暫時換個口味,讀讀和資料庫有關的技術文章了。

我想是多年前的技術,這邊只是簡單的描述一下我這幾天所認識的LINQ,也是重點筆記了。

好了,底下這張圖就是我所知道的全部了,完全沒有技術面,是一個一個的框框…(強調,這是個人知道的全部,不是說LINQ沒有技術面)
image

當然,該讀的MSDN文章,什麼技術什麼優勢的,我想去官網看一下就知道了…但是我看完的第一個問題就是:

SQL SERVER很好用了,前端的開發平台也有了 ADO.NET ,ADO.NET 和 ASP.NET 中間又有個 DataSource 控制項讓我完美銜接,我還要一個新的資料庫語言幹什麼?

後來實作了一些範例後…我只能說我漸漸喜歡他了…雖然我不大了解她,至於實作了什麼內容可以讓我有想學的衝動,啊不就是那官網的範例,雖然「看」起來亂了一點,但「作」的時候會了解他編排的目的是什麼。以下就是我得的結論:


一、我覺得泛型類型是LINQ架構的精神:


image

上圖是從對岸的MSDN(http://msdn.microsoft.com/zh-cn/library/w256ka79(v=vs.90).aspx)爬來的,圖在解釋泛型類型就好比是可拆式的螺絲起子(把手的部分指的就是泛型工具),遇到一字、十字、星字的螺絲(就是指型別),只要換頭,就可以轉下螺絲了。重點是從辨識螺絲類型到換頭的這一段過程,你也「可以」不用自已動手,機器人會幫你做。

這段雖然是在講泛型,但我覺得拿來套到LINQ上解釋也不錯,就我知道的,在不同SQL平台上,型別定義不同,陳述式和可以使用的函數也不同…比方說

以前mysql 不支持 nchar,nvarchar,ntext 類型 (現在有沒有我不知道,早期是MS SQL 有,同時期的MySql沒有)

如果要從資料表隨機撈資料:
SQL Server:select top 10 * from 資料表 order by newid()
ACCESS:SELECT top 10 * FROM 表 ORDER BY Rnd(id)
MySql:Select * From 表 Order By rand() Limit 10

上面都還是同樣都是T-SQL,如果是差別更大的資料庫系統,那語法上會不會更不同?

所以張圖的螺絲把手就是LINQ,針對不同的資料類型,用同一隻把手來解決,至於什麼時候要換頭,讓LINQ去傷腦筋就好。

上圖可以詮釋LINQ,而LINQ開發的主要依據我認為也是泛型類別,資料在取出前,可以不用知道這些內容是什麼類別,所以你也不用去讀資料庫的手冊來定義類別(搞不好你用的語言也定義不出來),撈出來的資料「可以」讓LINQ去判斷是什麼類型。

所以對我來說,LINQ 是一個

二、我覺得LINQ是物件的物件的物件………的物件
(天啊,我現在到底在哪一層):

LINQ 可以查詢的來源,可以是 LINQ TO SQL、LINQ TO XML…只要是可以列舉的都可以用同一種查詢技術來取得資料,和以往比起來,ADO.NET限於資料庫的應用、XML也有自已的查詢技術、DATASET其實要用也不難…但我覺得這張圖最敢的地方就是說LINQ可以「LINQ TO OBJECT」,簡單的說就是 LINQ TOEVERYTHING…因為EVERYTHING  IS OBJECT。

我突然想到以前收藏的一篇文章,

What Is Service-Oriented Architecture

裡頭有一段很棒的內容,關於 Loose Coupling (鬆散耦合)的舉例:

如果我們去旅行,一定要記得帶上適合當地的電源轉接器,因為每個地方用的電壓不同,然後每個地方的插座也不同。然後你可以發現每個轉接器的設計也不一樣,有些小而輕便,有的卻大且笨重。

我們實質的需求是電,但現實中又不能完全消除人為的依賴。

The lesson here is that we cannot remove artificial dependencies, but we can reduce them.
所以這給我們上了一課,我們不能消除人為的相依,但我們可以減少這些相依…

LINQ 對我來說,就像是個 Loose Coupling 的例子,我們面對太多的查詢語言了,這些相依性如果能減少到只剩下 LINQ 一個,那麼就實現了這個理想…

比方說我們想要吃肯德雞的炸雞,在台灣點餐說炸雞,在美國就要說fried chicken,這是語言的相依性,到了各國就免不了要換語言,所以肯德基說,現在不要管是什麼了,給你一張圖,給你號碼,你用比的我都知道你要什麼…我的店員會把你的號碼記下來,自已轉換成實體給你。(這是什麼爛例子,但我要說的是…)

就算是減少了人為的相依性,但是中間的涵意相依性還是沒有變,LINQ 想要統吃物件,誰知道他的中間層 (涵意層) 下了多少工夫來實現轉換。

會不會有一天我們只知道用手指頭比幾號餐,不知道炸雞叫炸雞。
(會不會有一天我們只知道LINQ,不知道SQL Server 查詢語法要怎麼寫)

而且就算改成用數字號碼,還是一種人工語言。就好比XML 再怎樣說是超語言,終究還是人工語言一樣,有一天會不會又出來一種要包LINQ又要包LINQ沒有的另一個人工語言,就好像LINQ把ADO.NET包起來一樣。

image


是不是LINQ真如我自已所想,是我後面這幾天想要驗證的事情,一切只有實作再實作才能證明。我覺得還蠻適合我的,我覺得LINQ的位置就是在ADO.NET與ASP.NET之間,ADO.NET的時候,就在前端搞一些加減乘除等等計算的事情,根本不會在SQL SERVER端弄預存程序。現在更好了,不但可以玩MS SQL,還可以用同一種查詢技術加上熟悉的語言來弄其他的物件。手好癢啊。

不好意思,感覺是篇不懂裝懂的文章,我是真的不懂才學習,有的時候是感覺很武斷沒錯,但我相信經驗是累積的,錯誤也是學習的方法之一,專業的文章不會在這裡出現,只是自已想分享給大家的閱讀和實作心得 (有時候連結比文本還值得看) ,如此而已。寫完這篇文章唯一值得安慰的地方是…YA…我多了一個TAG,名叫…LINQ,里程碑。

沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...
// Dnow Function