iT邦幫忙

DAY 18
3

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

LINQ自學筆記-語法應用-取出資料-Select 運算子

  • 分享至 

  • xImage
  •  

LINQ 語法第一篇文章,當然是先講怎麼取資料,也就是 Select 標準查詢運算子。
自學筆記這系列是我自己學習的一些心得分享,歡迎指教。這系列的分享,會以 C# + 我比較熟的 Net 3.5 環境為主。
另外本系列預計至少會切成【打地基】和【語法應用】兩大部分做分享。打地基的部分,講的是 LINQ 的組成元素,這部分幾乎和 LINQ 無關,反而是 C# 2.0、C# 3.0 的一堆語言特性,例如:型別推斷、擴充方法、泛型、委派等等,不過都會把分享的範圍限制在和 LINQ 應用有直接相關功能。
PS. LINQ 自學筆記幾乎所有範例,都可直接複製到 LINQPad 4 上執行(大多是用 Statements 和 Program 模式)。因為它輕巧好用,功能強大,寫範例很方便,請大家自行到以下網址下載最新的 LINQPad:http://www.LINQpad.net/。
Select 運算子用於根據資料來源序列中的項目,建立相對應的輸出序列。輸出序列之項目型別可以和原始序列之項目型別相同,也可以不同,這個行為又稱之為「投影」(Projecting)。LINQ 可以投影出以下幾種結果:

  1. 單一值的查詢結果。
  2. 輸出 IEnumerable<T> 的序列,T 和來源項目是同一型別,類似關聯式資料庫的 Select * 效果。
  3. 輸出 IEnumerable<T> 的序列,T 有可能是任一個現有型別(系統內建或自訂之型別),也有可能是匿名型別,此查詢方式類似關聯式資料庫的 Select column1, column2, column3 的效果。
  4. 輸出 IEnumerable<T> 的序列,T 是實做 IGrouping<TKey, TElement> 的序列。
  5. 多個資料來源序列合併為新的實做 IEnumerable<T> 之輸出序列。
  6. 建立不同格式的輸出序列,例如:將關聯式資料庫的資料或文字檔,轉換為 XML 格式。
    PS. 上述的 IEnumerable<T> 輸出序列,有可能真的是 IEnumerable<T>,或是其它有實做 IEnumerable<T> 的型別。

以下為最簡單的查詢範例:

//資料來源
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());
}

以下為 Select 運算子最常用的定義:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, TResult> selector
)

第一個參數有 this 修飾子,所以表示這個 Select 方法是 IEnumerable<TSource> 的擴充方法;第二個參數是一個 Func<TSource, TResult>,也就是一個 Func 委派,換言之,我們可以用 Lambda 運算式提供要選取的項目屬性:
PS. 若忘記擴充方法、Func 委派或 Lambda 運算式,可回頭翻閱此系列先前的分享文章,有清楚的說明。

var query = from c in Customers
            where c.City == "London"
            select new {c.CustomerID, c.CompanyName, c.City};
query.Dump();


沒看到 Lambda 運算式啊?!這是因為我們用是「查詢表達式」,所以看不到。先前文章有說過,CLR 不認得查詢表達式,所以編譯器會先幫我們把查詢表達式翻譯成 CLR 認得的「方法架構查詢」,我們看看編譯器的翻譯結果:

這樣應該清楚了吧。其實從上述的內容,大家應該慢慢會了解,為什麼我要花那麼多篇幅寫 LINQ 的地基,因為沒有那些基礎,語法應用時會很難理解也很難說明。

對了,上述程式碼我們是利用 LINQ to SQL 存取北風資料庫的 Customers 資料表,資料表定義如下:

Select 寫太多了,所以 SelectMany 就放到下一篇再說明囉。


上一篇
LINQ自學筆記-打地基-延後執行
下一篇
LINQ自學筆記-語法應用-取出資料-SelectMany 運算子
系列文
分享一些學習心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言