iT邦幫忙

DAY 13
2

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

LINQ自學筆記-打地基-LINQ語法123

本文旨在說明是 LINQ 語法基本結構(統一的程式碼撰寫模式),以及如果提高 LINQ 的學習成效,讓 LINQ 練習和實務工作環境貼近。
自學筆記這系列是我自己學習的一些心得分享,歡迎指教。這系列的分享,會以 C# + 我比較熟的 Net 3.5 環境為主。
另外本系列預計至少會切成【打地基】和【語法應用】兩大部分做分享。打地基的部分,講的是 LINQ 的組成元素,這部分幾乎和 LINQ 無關,反而是 C# 2.0、C# 3.0 的一堆語言特性,例如:型別推斷、擴充方法、泛型、委派等等,不過都會把分享的範圍限制在和 LINQ 應用有直接相關功能。
PS. LINQ 自學筆記幾乎所有範例,都可直接複製到 LINQPad 4 上執行(大多是用 Statements 和 Program 模式)。因為它輕巧好用,功能強大,寫範例很方便,請大家自行到以下網址下載最新的 LINQPad:http://www.LINQpad.net/。
不管開發那種系統,或是開發遊戲,都會儲存大量的資料,包含各種參數設定,因此大多時候都是在執行「查詢資料」作業,但是傳統查詢資料,會牽涉到資料儲存體類型,常見的有各種不同的關聯式資料庫、文字檔(還牽扯到格式)、記憶體等等,不同的資料儲存體,要取出資料時必須透過不同的查詢語法,因此開發人員幾乎都必須同時會好幾種查詢語法,但是 LINQ 技術讓 .Net 開發人員可以使用相同的查詢語法,從不同的資料來源中取回必要的資料。

在 LINQ 查詢中,我們的查詢對象其實都是「物件」,不論要查詢及轉換的資料是存在 XML 文件、SQL 資料庫、ADO.NET 資料集和實體 (Entity),還是 .NET Framework 集合,以及其他任何有可用 LINQ 提供者(Provider)的來源或格式中,都是使用相同的基本程式碼撰寫模式。

這個模式很簡單:

  1. 建立或設定資料來源。

  2. 建立查詢語法。

  3. 執行查詢作業,實際取回資料。
    C#:

    //資料來源
    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
    */

VB:

'資料來源
Dim words() As String = { "Hello", "wonderful", "LINQ", "beautiful", "World" }
'LINQ查詢表達式
Dim shortWords = from word in words _
  where word.Length <= 5 _
  select word
'顯示查詢結果
For Each item In shortWords
    Console.Write(item & " ")
Next
'輸出:Hello LINQ World 

所以建立、設定資料來源,是學習 LINQ 的第一件事。上述範例,我們的資料來源是一個字串陣列,大部分練習我們都是利用陣列、 .NET Framework 集合做資料來源,不過實務上,若原始系統是 .Net 2.0 甚至 .Net 1.1 版本,然後升版到 .Net 3.5,比較常用的應該是 ADO.NET 資料集,不過這個也不需要什麼設定,只要呼叫 DataTable.AsEnumerable() 方法即可應用 LINQ。比較麻煩的是 LINQ to Entity 和 LINQ to Sql。若系統使用的是 MS Sql 資料庫,那就簡單,因為 Visual Studio 2008 內建即可支援,但是非 MS Sql 資料庫,就要外掛各家廠商所提供的 Data Provider。

這裡要先說明一下,其實微軟策略中,LINQ to Sql 因為和 LINQ to Entity 有太多重疊的部分,因此從 .Net 4.0 開始,將只專注提出 Entity Framework 的新版本,LINQ to Sql 將停止更新,但是在我們學習 LINQ 時,若要使用 LINQ to Entity ,其實有太多額外的事情要處理(Entity Framework 要能運作起來,是必須經過好些設定手續),而且甚至有些關聯式資料庫,並沒有提供 .Net 3.5 的 Linq to Entity(例如 Oracle),甚至到 .Net 4.0 也只有非官方的 Provider,我覺得在學習 LINQ 時,這些額外的成本,都將拖長學習時程,因此我其實強烈建議,若是要練習 LINQ to 關聯式資料庫,選擇 LINQ to Sql 會比較輕鬆,而且透過 LINQPad,連 Visual Studio 都可以不用安裝,更方便。

但是若非 MS Sql,怎麼在 LINQPad 中應用 LINQ to Sql 呢?若是 MySql、Sqlite、Oracle(我本身實際環境也是用這三種),強烈建議用 IQ Driver,簡單設定就可以用了喔!

  1. 按 LINQPad 左上角 【Add connection】 連結:
  2. 按【View more drivers】鈕:
  3. 按 IQ Driver 的【Download & Enable Driver】連結,即可在 LINQPad 中安裝好 IQ Driver:

    裝好 IQ Driver,在 Add connection 中,就 Build data context automatically 區塊,就可以找到它,透過很簡單的設定,就可以連結到三種資料庫囉!

Sqlite 只要設定好資料庫實體檔案位置和密碼即可;MySql 則是設定資料庫伺服器的 IP、資料庫名稱和帳號、密碼即可;Oracle 稍微麻煩一點,要看是否有安裝 Oracle Client 來決定連線的方式。

其實大概只有 Oracle 這部分可能需要多些手續設定,若有朋友需要我再另行撰文說明。

總結這篇文章的重點其實只有兩件事:

  1. 不管那一種 LINQ 應用,其實都是三件事,就是建立、設定資料來源、建立查詢語法和取回查詢結果。
  2. 練習 LINQ 時,盡量不要被其他無關的事情影響,所以強烈建立用 LINQPad,而且為了貼近實務應用,其實建立用 IQ Driver 來建立 LINQ to Sql 來練習 LINQ,會讓學習成效更佳。

上一篇
LINQ自學筆記-打地基-匿名型別
下一篇
LINQ自學筆記-打地基-LINQ工作對象
系列文
分享一些學習心得30

尚未有邦友留言

立即登入留言