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 可以投影出以下幾種結果:
以下為最簡單的查詢範例:
//資料來源
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 就放到下一篇再說明囉。