LINQ(Language Integrated Query)是 C# 3.0 核心特性,提供類 SQL 的查詢語法整合在語言中。本文從基本查詢、語法設計哲學、into 關鍵字、GroupBy 進階用法全面解析。
int[] arr = { 8, 5, 89, 3, 56, 4, 1, 58 };
// 查詢小於 5 的數字,依大小排序
var m = from n in arr
where n < 5
orderby n
select n;
foreach (var n in m)
Console.WriteLine(n); // 輸出:1, 3, 4
| LINQ | SQL | 說明 |
|---|---|---|
from n in arr | FROM table | 資料來源 |
where n < 5 | WHERE col < 5 | 篩選條件 |
orderby n | ORDER BY col | 排序 |
select n | SELECT col | 投影/選取 |
from 開頭而非 select?核心原因:IDE 智慧感知(IntelliSense)體驗。
Select ... From ... 順序Select p. 時,p 型別未知(因 From p In persons 尚未輸入),無法提供屬性提示from 確立資料來源與範圍變數型別,再 select 享有完整智慧感知From ... Select ... 順序// Select 開頭(舊 VB9):寫到 Select p. 卡住,必須先寫 From 再跳回修改
Select p.Name, p.Age From p In persons Where ...
// From 開頭(C# / 現代 VB):自然順序,智慧感知全程可用
from p in persons
where ...
select p.Name, p.Age
需求:將程式語言依字串長度分組,組內按字母序,組間按長度遞減排序。
string[] languages = { "Java", "C#", "C++", "Delphi", "VB.net", "VC.Net", "C++ Builder", "Kylix", "Perl", "Python" };
var query = from item in languages
orderby item
group item by item.Length into lengthGroups
orderby lengthGroups.Key descending
select lengthGroups;
foreach (var group in query)
{
Console.WriteLine($"strings of length {group.Key}");
foreach (var val in group)
Console.WriteLine(val);
}
into 解析into lengthGroups:將前一步驟(group by)的結果繼續作為下一個查詢的產生器where、orderby、selectgroup ... by ... into、join ... into、select ... into 使用| 特性 | SQL GROUP BY | LINQ GroupBy |
|---|---|---|
| 資料結構 | 二維表格(扁平) | 階層式群組物件(IGrouping) |
| 彈性 | 受限於關聯模型 | 物件導向,可保留完整元素、巢狀查詢 |
| 後續處理 | 需子查詢或 JOIN | 直接 foreach 群組、投影、再分組 |
LINQ GroupBy 回傳 IEnumerable,每個 IGrouping 本身即 IEnumerable,極具表達力。
上述查詢語法編譯後會轉換為方法語法(Lambda 運算式):
// 查詢語法
var q = from n in arr where n < 5 orderby n select n;
// 等價方法語法
var m = arr.Where(n => n < 5).OrderBy(n => n).Select(n => n);
兩者無效能差異,查詢語法較適合複雜多子句查詢,方法語法適合簡單鏈結。
from 開頭,為智慧感知設計into 關鍵字實現查詢續集,支援 group by 後續處理GroupBy 回傳階層式群組,比 SQL 更靈活強大