ページ

2011年4月10日日曜日

◆LINQでのグループ化結合処理(GroupJoin)

NorthwindのOrderとOrder_Detailのように1対多で多を集計していく処理。
MTG Blog: ◆LINQで明細集計処理で行ったのと同じ処理をリレーションが張られていないものとしてGroupJoinを使って集計してみる。

自分でJoinしなければいけない分やはり若干面倒な処理となる。

  1. //グループ化結合処理(GroupJoin)  
  2. public void linqGroupJoin(Form1 form)  
  3. {  
  4.     using (NorthWindDataContext nwnd = new NorthWindDataContext())  
  5.     {  
  6.         var sumPrice = nwnd.Order.GroupJoin(nwnd.Order_Details,  
  7.             o => o.OrderID, od => od.OrderID,  
  8.             (o, g) => new  
  9.             {  
  10.                 o.OrderID,  
  11.                 o.CustomerID,  
  12.                 price = g.Sum(od => od.Quantity * od.UnitPrice)  
  13.             });  
  14.         form.dataGridView1.DataSource = sumPrice;  
  15.     }  
  16. }  

8行目でOrder_Detailをグループ化したコレクションをgで参照するよう指定している。
あとは、リレーションが張られているときと同様にSum拡張メソッドで集計してあげればOKだ。


埋め込みクエリー方式はこちら。


  1. //グループ化結合処理(GroupJoin)  
  2. public void linqGroupJoin(Form1 form)  
  3. {  
  4.     using (NorthWindDataContext nwnd = new NorthWindDataContext())  
  5.     {  
  6.         var sumPrice = from o in nwnd.Order  
  7.                        join od in nwnd.Order_Details on o.OrderID equals od.OrderID into g  
  8.                        select new  
  9.                         {  
  10.                             o.OrderID,  
  11.                             o.CustomerID,  
  12.                             price = g.Sum(od => od.Quantity * od.UnitPrice)  
  13.                         };  
  14.         form.dataGridView1.DataSource = sumPrice;  
  15.         Console.Beep();  
  16.     }  
  17. }  


グループ化後のOrder_Detailをintoでgに入れている。

0 件のコメント:

コメントを投稿

私が最近チェックした記事