Select 子句決定輸出形狀:可返回原對象、屬性、新對象、匿名類型、方法調用結果。
// 只取姓名
var names = from s in students where s.Name.Length > 3 select s.Name;
// 返回原對象
var filtered = from s in students where s.Name.Length > 3 select s;
// 新建實體對象
var dtos = from s in students where s.Name.Length > 3
select new Student { Id = s.Id, Name = s.Name };
// 匿名類型 (最常用)
var anon = from s in students where s.Name.Length > 3
select new { s.Id, s.Name };
// 對結果調用方法
var strings = from s in students select s.ToString();
當元素本身是集合時,SelectMany 將多個子序列合併為一個平坦序列。
// 字串實現 IEnumerable<char>,可扁平化為字符序列
var allChars = students.SelectMany(s => s.Name);
// 等價查詢語法
var allChars = from s in students from ch in s.Name select ch;
// 實際場景:訂單-明細扁平化
var allItems = orders.SelectMany(o => o.Details);
僅支援方法語法,需元素實現相等比較 (值類型自動、引用類型需覆寫 Equals/GetHashCode 或提供 IEqualityComparer)。
var uniqueChars = students.SelectMany(s => s.Name).Distinct();
| 方法 | 用途 | 示例 |
|---|---|---|
| First() | 第一個元素,無則拋異常 | students.First() |
| FirstOrDefault() | 第一個元素,無則默認值 | students.FirstOrDefault() |
| Last() | 最後一個元素 | students.Last() |
| Single() | 唯一元素,多於一個拋異常 | list.Single() |
| Skip(n) | 跳過前 n 個 | students.Skip(2) |
| Take(n) | 取前 n 個 | students.Skip(2).Take(1) |
Key 必須實現 IComparable。支援多級排序:ThenBy、ThenByDescending。
// 單級降序
var sorted = from s in students orderby s.Name descending select s.Name;
// Dark, Cindy, Bill, Andy
// 多級:先按姓名長度升序,同長度再按名字降序
var multi = students
.OrderBy(s => s.Name.Length)
.ThenByDescending(s => s.Name);
// 查詢語法
var q = from s in students
where s.Name.Length > 3
orderby s.Name descending
select new { s.Id, s.Name };
// 方法語法 (編譯器實際生成的形式)
var m = students
.Where(s => s.Name.Length > 3)
.OrderByDescending(s => s.Name)
.Select(s => new { s.Id, s.Name });
OrderBy 返回 IOrderedEnumerable<T>,才能鏈式調用 ThenBy。直接 Select 後失去排序能力。
Where 放在 OrderBy 前:先篩選再排序,減少排序元素數Skip/Take 在 LINQ to Objects 仍需遍歷前 N 個,考慮數據庫端分頁Select/Where/OrderBy 是 LINQ 三大核心算子,組合起來能表達絕大多數查詢需求。