linq將大部分SQL語句進行了封裝,這使得它們更加面向對象了,對於開發者來說,這是一件好事,下面我從基礎層面來說一下GroupBy在LINQ中的使用。
概念
GroupBy,顧名思義,它是對集合中某個或者某幾個字段進行分組,按着這個分組字段(這里叫key)進行排列,例如,我們按着用戶表中部分進行分組,結果它會把人事部門的用戶信息放在一起,技術部門的用戶信息放在一起,一般地,在SQL里,我們只是對它們進行簡單的聚集計算,如按着部門進行人員數量上的統計,按着學科統計一個學生的成績等等,而LINQ中,這個功能當然也可以實現,但不是今天的重點,也不是LINQ本身的重要,LINQ是面向對象的,它的groupby也是一樣,它把將各個部門中的用戶信息實體放在一個集合里,給開發人員返回一個完整的用戶對象。
實例
用戶表結構:

要實現的功能:對用戶表中“部門”字段“進行分組,將一個部門的用戶列表做到一起,呵呵
代碼實現1:
var linq = UserRepository.GetModel().GroupBy(i => i.DepartmentID); linq.ToList().ForEach(i => { Response.Write(i.Key + "<hr>"); foreach (var item in i as IGrouping<int, WebManageUsers>) { Response.Write(item.RealName); } Response.Write("<hr>"); });
代碼實現2:事實上,實現上面的實現groupby已經做了一些重載,可以直接實現,如下代碼:
var user = UserRepository.GetModel().GroupBy(i => i.DepartmentID, (i, v) => new { DepartmentID = i, userlist = v,//這里的userlist是一個集合,它應該是延時的,不能使用ToList()將它在代碼塊中變為立即執行的,同理不能使用First(),FirstOrDefault等實時查詢的方法 }); user.ToList().ForEach(i => { Response.Write(i.DepartmentID + "<hr>"); i.userlist.ToList().ForEach(j => { Response.Write(j.RealName); }); Response.Write("<hr>"); });
結果如圖:

比較這兩種方法,覺得第二種的結構更好一些,第一種邏輯上比較簡單,但引入了新的類型IGrouping<Key,IEnumerable<Value>>,對於這種情況,個人還是推薦用第二種方法。
代碼測試環境為Linq To Entity(entityframework 5)
