iT邦幫忙

DAY 14
3

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

LINQ自學筆記-打地基-LINQ工作對象

上一篇文章有提到 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 的工作對象都是物件,但是物件有成千上萬種,那些物件可以應用 LINQ 查詢呢?要依資料來源的類型來分:

  1. LINQ to SQL:物件模型(Object Model)。MSDN (http://msdn.microsoft.com/zh-tw/library/bb386989.aspx)說明如下:
    在 LINQ to SQL 中,以開發人員之程式語言表示的物件模型 (Object Model) 會對應至關聯式資料庫的資料模型。 然後就會根據物件模型對資料執行作業。
    在這種情況下,您不會發出資料庫命令 (例如,INSERT) 至資料庫。 而是在您的物件模型中變更值和執行方法。 當您要查詢資料庫或將變更傳送至資料庫時,LINQ to SQL 會將您的要求轉譯為正確的 SQL 命令,並將這些命令傳送至資料庫。

    但在學習 LINQ 時,用 LINQPad 就別管上述的定義了,因為 LINQPad 幫我們做掉要設定的部分,所以直接就可以對資料表進從 LINQ 查詢、更新:

    //1. 資料來源就是 LINQ to SQL,LINQPad 建立好連線,
    // 就可以直接以資料表做來源執行 LINQ 了
    //2. 建立 LINQ 查詢表達式
    var query =from x in Customers select new {x.ID, x.Name};
    //3. 執行查詢取回資料
    query.Dump();


PS. LINQPad 建立連線,請按左上角【Add connection】連結進行設定。

  1. LINQ to Entity:實作泛型 IQueryable<T> 介面之 ObjectQuery<T> 泛型類別的執行個體會當做 LINQ to Entities 查詢的資料來源。ObjectQuery<T> 泛型類別表示傳回零個或多個具型別物件之集合的查詢。
    換言之,就是只要有實做 IQueryable<T> 的類別就可以應用 LINQ 執行查詢。但是誠如上一篇談 LINQ 語法123 中所言,LINQ to Entity 必須經過一些設定手續(建立專案、設定 Entity framework 環境、從資料庫把資料表加入實體資料模型(edmx)、編譯完產出 dll 組件檔案、在 LINQPad 中設定 LINQ to Entity 的連線),說真的,我覺得對 Entity Framework 不熟悉的朋友,在設定階段就已經不想搞了,所以雖然實務上 LINQ to Entity 很好用也挺常用,不過在學習 LINQ 時,我一貫態度是,不要用 LINQ to Entity 做資料來源,才不會輸在學習的起跑點上。

  2. LINQ to XML:當然就是一份 XML 文件,但是請記得,是一份在「記憶體」中的 XML 文件,就算該文件原始是一份檔案,也必須先載入到記憶體中才能執行:

    void Main()
    {
    //定義第一段XML資料
    XElement bookXML = new XElement("Books",
    new XElement("Book1", "C++程式設計"),
    new XElement("Book2", "演算法與資料結構"),
    new XElement("Book3", "作業系統")
    );
    bookXML.Dump("節點添加之前的XML資料:"); //輸出第一段XML資料
    //定義第二段XML資料
    XElement languageBookXML = new XElement("Books",
    new XElement("Book4", "Javascript實戰"),
    new XElement("Book5", "HTML5開發應用"),
    new XElement("Book6", "C#完全學習手冊")
    );
    //找到一個特定的節點
    XNode child1 = bookXML.Element("Book1");
    //在節點後面添加新的元素
    child1.AddAfterSelf(
    //將languageBookXML的所有元素添加到節點後面
    from el in languageBookXML.Elements()
    select el
    );
    //輸出添加完畢的XML資料
    bookXML.Dump("節點添加之後的XML資料:");
    }
    /* 最後的輸出結果:

    C++程式設計
    Javascript實戰
    HTML5開發應用
    C#完全學習手冊
    演算法與資料結構
    作業系統

    */

  3. LINQ to Objects:其實 LINQ 查詢的對象都是物件,但是「LINQ to Objects」所定義的是指:直接將 LINQ 查詢與任何 IEnumerable 或 IEnumerable<T> 集合搭配使用,而不透過中繼 LINQ 提供者或 API (如 LINQ to SQL 或 LINQ to XML)。基本上就是任何可列舉的集合,例如:List<T>、Array 或 Dictionary<TKey, TValue>。集合可以是使用者定義的集合,也可以是 .NET Framework API 傳回的集合。

更簡單且精確的說法,就是任何實做 IEnumerable<T> 的類別都可應用 LINQ 執行查詢,因為若只有實做 IEnumerable 介面,但沒有實做 IEnumerable<T> 的話,是無法直接應用 LINQ,必須透過 IEnumerable 的擴充方法轉成 IEnumerable<T> 才行:
● OfType<TResult>
● Cast<TResult>
● AsEnumerable(TSource)

  1. LINQ to Datasets:利用 DataTableExtensions.AsEnumerable 將 DataTable 轉成 IEnumerable<DataRow> 後,以 LINQ to Objects 的方式使用 LINQ。
    請注意,DataTableExtensions 是位於 System.Data.DataSetExtensions 組件中,使用前要記得先將它加入參考。

上述五種 LINQ 工作對象,在實務上都會用到,但是在學習 LINQ 時,我個人撰寫簡單範例都會利用 LINQ to Objects 的方式,若要撰寫複雜案例,或者想和工作環境相結合,一開始都是先用 LINQ to SQL,省去 LINQ to Entity 建置環境所需花的時間。


上一篇
LINQ自學筆記-打地基-LINQ語法123
下一篇
LINQ自學筆記-打地基-查詢運算式
系列文
分享一些學習心得30

尚未有邦友留言

立即登入留言