從資料庫撈回 10 筆訂單明細,每筆包含「訂單號」、「明細號」、「發票號」。明細號唯一,但訂單號可重複(如前 3 筆訂單號為 A,中 3 筆為 B,後 4 筆為 C)。業務需求:每個訂單號只取第一筆明細的發票號。
var firstInvoices = list
.GroupBy(x => x.OrderNo) // 依訂單號分組
.Select(g => g.First().InvoiceNo); // 取每組第一筆的發票號
var firstDetails = list
.GroupBy(x => x.OrderNo)
.Select(g => g.OrderBy(x => x.DetailNo).First()); // 若需按明細號排序後取第一筆
ROW_NUMBER() OVER (PARTITION BY OrderNo ORDER BY DetailNo) 直接過濾,減少網路傳輸與記憶體壓力。for 迴圈搭配 Dictionary<string, T> 也能達到 O(n) 複雜度。善用 GroupBy + First/Select 模式,能以極簡潔的程式碼解決「分組取首」類需求,是 C# 開發者必備的 LINQ 慣用語。