LINQ 的查詢語法在很大程度上模仿了 SQL,SELECT、WHERE、JOIN 等子句都有相對應的標準寫法。然而,Group/By/Into 子句卻展現了 LINQ 與 SQL 截然不同的核心能力——回傳階層式資料結構。SQL 永遠回傳扁平的矩陣式結果集,而 LINQ 能夠輕鬆產生巢狀、層次分明的物件圖,這為複雜資料處理帶來了革命性的便利,同時也引入了新的查詢複雜度。
以「依國家與城市分組查詢客戶」為例:
LINQ 透過巢狀子查詢,在單一陳述式中完成上述所有工作:
var q =
from c in db.Customers
group c by c.Country into g
select new {
g.Key,
Count = g.Count(),
SubGroups = from c in g
group c by c.City into g2
select g2
};
這段程式碼展示了 LINQ 強大的投影與巢狀分組能力:外層依 Country 分組,內層在每個國家群組中再依 City 細分,最終產生包含國家、統計數量、城市子群組的匿名型別集合。
為展現 LINQ 架構的彈性,專家 Mitsu 將上述邏輯封裝為通用擴充方法,簡化至單行呼叫:
var result = customers.GroupByMany(c => c.Country, c => c.City);
此實作適用於任何 LINQ 查詢來源(LINQ to Objects、LINQ to SQL、LINQ to Entities 等),完整原始碼與運作原理解析可參考 Mitsu 的部落格文章。這體現了 LINQ 不只是查詢語法,更是一個可擴充、可組合的查詢引擎基礎設施。