基礎才是重中之重~理解linq中的groupby


linq將大部分SQL語句進行了封裝,這使得它們更加面向對象了,對於開發者來說,這是一件好事,下面我從基礎層面來說一下GroupBy在LINQ中的使用。

對GroupBy的多字段分組,可以看我的這篇文章

概念

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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM