很大程度上來講,LINQ的工作方式很像SQL。查詢源定義、join、select和where子句都是相當標准的,而Group/By/Into子句則正是我們這裡要仔細說明的。SQL總是返回矩陣式數據集,與它不同的是,LINQ具備了返回層次化數據的能力,這也給它自己帶來了更多新的挑戰。
舉一個例子,將客戶按照所屬country和city進行分組查詢,在SQL中,可能會通過在客戶端手動分組或者執行1+N+(N*M)次查詢來實現,一個查詢用來獲取所有的國家,一個查詢用來獲取每個國家的所有城市,然後再逐個查詢出每個國家的每個城市下所有的客戶列表。
而在LINQ中,它可以通過一個帶有一系列子查詢的查詢語句一次性完成,當然,這也增加了查詢的復雜度。Mitsu演示如下:
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框架的靈活性,Mitsu將它簡化到了僅一行:
var result = customers.GroupByMany(c => c.Country, c => c.City);
Mitsu用一種能適用於任何LINQ查詢的方式實現了它。你可以在他的博客上查看源碼以及關於它是如何工作的解釋文章。