LINQ (Language Integrated Query) 是 C# 3.0 引入的核心功能,提供統一的資料查詢語法。本文以實用範例快速展示查詢語法與方法語法的對應關係。
var people = new List
{
new Person { Name = "Alice", BmiValue = 22 },
new Person { Name = "Bob", BmiValue = 28 },
new Person { Name = "Charlie", BmiValue = 31 },
new Person { Name = "Diana", BmiValue = 24 }
};
// 查詢語法:類 SQL 風格
var highBmiPeople = from p in people
where p.BmiValue > 25
select p;
// 只選取姓名
var names = from p in highBmiPeople
select p.Name;
// 執行查詢並顯示
foreach (string name in names)
{
MessageBox.Show(name); // 依序顯示 Bob, Charlie
}
// 等價的方法鏈結寫法
var highBmiPeople = people.Where(p => p.BmiValue > 25);
var names = highBmiPeople.Select(p => p.Name);
// 一行寫法
var names = people
.Where(p => p.BmiValue > 25)
.Select(p => p.Name);
foreach (string name in names)
{
MessageBox.Show(name);
}
| 特性 | 查詢語法 | 方法語法 |
|---|---|---|
| 可讀性 | 複雜查詢更接近 SQL,易讀 | 簡單查詢更簡潔 |
| 功能完整性 | 不支援所有運算子 (如 Count, Max) | 支援所有 LINQ 運算子 |
| 除錯 | 難以在中間步驟設中斷點 | 可在任意 .Where/.Select 設中斷點 |
| IntelliSense | 支援較弱 | 完整支援 |
| 編譯轉換 | 編譯器轉換為方法語法 | 原生 |
| 分類 | 運算子 | 說明 |
|---|---|---|
| 篩選 | Where | 條件篩選 |
| OfType | 型別篩選 | |
| Distinct | 去重複 | |
| Take/Skip | 分頁 | |
| 投影 | Select | 轉換形狀 |
| SelectMany | 扁平化巢狀集合 | |
| Zip | 合併兩序列 | |
| Cast | 型別轉換 | |
| 排序 | OrderBy/ThenBy | 遞增排序 |
| OrderByDescending/ThenByDescending | 遞減排序 | |
| Reverse | 反轉順序 | |
| 分組 | GroupBy | 分組 |
| ToLookup | 建立查找表 | |
| Join | 內部聯結 | |
| GroupJoin | 群組聯結 | |
| 集合 | Union | 聯集 |
| Intersect | 交集 | |
| Except | 差集 | |
| Concat | 串接 | |
| 量詞 | Any | 任一符合 |
| All | 全部符合 | |
| Contains | 包含元素 | |
| 聚合 | Count/Sum/Average | 統計 |
| Min/Max | 極值 | |
| Aggregate | 自訂聚合 |
// 建立查詢:尚未執行 (延遲執行)
var query = people.Where(p => p.BmiValue > 25);
// 立即執行並具體化結果
var list = query.ToList(); // List
var array = query.ToArray(); // Person[]
var count = query.Count(); // int
var first = query.First(); // Person (拋出例外若無元素)
var firstOrDefault = query.FirstOrDefault(); // Person 或 null
// 分組統計:按 BMI 區間分組計數
var bmiGroups = people
.GroupBy(p =>
{
if (p.BmiValue < 18.5) return "Underweight";
if (p.BmiValue < 25) return "Normal";
if (p.BmiValue < 30) return "Overweight";
return "Obese";
})
.Select(g => new { Category = g.Key, Count = g.Count() })
.OrderBy(x => x.Category);
// 連接兩個資料源
var orders = new List { ... };
var customers = new List { ... };
var orderDetails = from o in orders
join c in customers on o.CustomerId equals c.Id
select new { o.OrderId, c.Name, o.Amount, o.Date };
LINQ 查詢語法適合複雜多條件查詢(類 SQL 思維);方法語法適合簡單鏈結、除錯、完整運算子支援。兩者可混用:from p in people.Where(...) select ...。掌握核心運算子與延遲執行特性,是高效使用 LINQ 的關鍵。