iT邦幫忙

DAY 1
6

分享一些學習心得系列 第 1

LINQ自學筆記-打地基-認識LINQ

  • 分享至 

  • xImage
  •  

自學筆記這系列是我自己學習的一些心得分享,歡迎指教。先打屁一下,LINQ 最近兩年才開始被我慢慢應用在專案中,原因很簡單,因為兩年前客戶才同意我陸續把一些新的專案和舊的 ASP 程式升版到 Net3.5,不過比較困擾的是工作上必須用 VB,不過我在學習時還是使用 C#,因為語法比較精簡,因此這系列的分享,我也是以 C# + 我比較熟的 Net 3.5 環境為主。

另外,LINQ 自學筆記系列,預計至少會切成【打地基】和【語法應用】兩大部分做分享。打地基的部分,講的是 LINQ 的組成元素,這部分幾乎和 LINQ 無關,反而是一些 C# 2.0、C# 3.0 的一堆語言特性,例如:型別推斷、擴充方法、泛型、委派等等,不過都會把分享的範圍限制在和 LINQ 應用有直接相關功能。

PS. LINQ 自學筆記所有範例,都可直接複製到 LINQPad 4 上執行。因為它輕巧好用,功能強大,寫範例很方便,請大家自行到以下網址下載最新的 LINQPad:http://www.LINQpad.net/。
LINQ (Language-Integrated Query)翻譯為中文可以叫做「整合式查詢語言」(對岸有直譯「語言集成查詢」),我個人認為它是 Net 工程師一定要會的技術,而且它就像瑞士刀一樣,有點程式開發經驗的工程師,人人拿到都會用,因為常用的 LINQ 語法和 Sql script 超像,而開發人員沒寫過 Sql script 應該幾乎沒有吧!

好,那 LINQ 到底是什麼東東?以下摘要呂高旭老師的說明:

LINQ 是一系列的擴充方法,讓開發人員可以藉由統一的資料存取模型,以相同的模式存取各種不同型態的資料來源。

幾年前我第一次看到這句話,是字字清楚,句句不懂,什麼是「擴充方法」?什麼是「資料存取模型」?「相同的模式」又是啥?這三個問題,也是我自學筆記最終的目標,希望朋友看完我的分享,大家都能正確回答這三個問題。

Ok,撇開上述的問題,我們先瞄一下 LINQ 的樣子,看看它和 Sql script 有多像:

//資料來源
string[] words = { "Hello", "wonderful", "LINQ", "beautiful", "World" };
//LINQ查詢表達式
var shortWords =
  from word in words
  where word.Length <= 5
  select word;
//顯示查詢結果
foreach (var e in shortWords)
{
    Console.WriteLine(e.ToString());
}
//輸出:Hello LINQ World

看到中間那段 LINQ 查詢表達式了嗎,除了把 Select 的語法放到最後,和一般的 Sql script 超像的對吧!關於 LINQ 語法稍後再繼續談,現在,我們把焦點拉回到「整合式查詢語言」這件事情上,下圖是學習 LINQ 必看,明確表達 LINQ 的種類,沒看過就落伍囉:

上圖看起來【好像】表達了以下幾件事:

  1. LINQ 可以支援查詢物件、關聯式資料庫、XML 三種資料來源。
  2. 針對三種資料來源,LINQ 也對應分為三種類型:LINQ to Objects、LINQ to XML、LINQ-enabled ADO.NET。
  3. LINQ 可以用 VB、C# 或「其他」語言撰寫。

一開始學習時,我對上述三件事當真了,但事實是殘酷的:

  1. .Net Framework 內建對關聯式資料庫的支援,只有 MS Sql,其他資料庫要等各家廠商或佛心來的高手撰寫 Provider 才能支援,而我工作主要用的 Oracle,很抱歉,.Net 4.0 才提供(而且我記憶中,還是 2011 年才推出),更無力的是我工作環境只有 .Net 3.5。
  2. 可以用「其他」語言撰寫 LINQ,但就我所知道,其他語言也只有安裝了 PowerPack 的 F# 2.0(.Net 4.0)和F# 3.0 (.Net4.5)才有支援 LINQ。

不過上述殘酷的現實只是讓我沒辦法在工作上應用 LINQ to Oracle,對物件、XML、Dataset 的查詢還是超方便的。扯遠了,沒想到這篇文章被我用一堆廢話給堆滿了,本來還要分享型別推斷,那就留到下一篇文章再講囉。


下一篇
LINQ自學筆記-打地基-區域型別推斷01
系列文
分享一些學習心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言