ページ

2011年4月10日日曜日

◆LINQで1対多多1のグループ集計処理

以下のstores,sales,titlesテーブル間で、店ごとの売上グループ集計処理を考えてみる。
20110410102751 

テーブルの関係はstoresとsalesが1対多。salesとtitlesが多対1である。
salesテーブルに売上を持っていれば、これまでやったようにstoresテーブルから手繰ってSUM拡張メソッドでsalesの売上を合計するだけだ。
しかし、salesには数量とtitle_idだけがあり、titleの単価はtitlesテーブルに持っているので、salesからまたその先のtitlesまで手繰らないといけない。

以下のような感じになる。

  1. //1対多対1のグループ集計処理  
  2. public void linqGroup1Many1(Form1 form)  
  3. {  
  4.     using (PubsDataContext pubs = new PubsDataContext())  
  5.     {  
  6.         pubs.Log = Console.Out;  
  7.         var salesByStore = pubs.stores.Select(st => new  
  8.             {  
  9.                 st.stor_id,  
  10.                 st.stor_name,  
  11.                 salesSum = st.sales.Sum(sls => sls.qty * sls.titles.price)  
  12.             });  
  13.         form.dataGridView1.DataSource = salesByStore;  
  14.     }  
  15. }  

salesオブジェクトのtitlesプロパティからpriceを手繰って持ってこれるのでそれ程難しいことはなさそうだ。(以前のグループ集計処理とほとんど同じ)


埋め込みクエリー方式では以下のとおり。


  1. //1対多対1のグループ集計処理  
  2. public void linqGroup1Many1(Form1 form)  
  3. {  
  4.     using (PubsDataContext pubs = new PubsDataContext())  
  5.     {  
  6.         var salesByStore = from st in pubs.stores  
  7.                            select new  
  8.                            {  
  9.                                st.stor_id,  
  10.                                st.stor_name,  
  11.                                salesSum = st.sales.Sum(sls => sls.qty * sls.titles.price)  
  12.                            };  
  13.         form.dataGridView1.DataSource = salesByStore;  
  14.         Console.Beep();  
  15.     }  
  16. }  

0 件のコメント:

コメントを投稿

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