ページ

2011年4月8日金曜日

◆LINQでマスターを使わないグループ集計

MTG Blog: ◆LINQでマスターを使ったグループ集計処理と同じものをマスターを使わずにGroupBy拡張メソッドを使ってやってみたのだが、そもそも最初に書いたサンプルがまずくてマスター項目を使用して金額を合計しているので結果的にはマスターも参照する必要が出てしまった。

とりあえず同じ結果がでるか試したかったので作ってみた。
要は前回マスター側を主として合計処理を行ったのに対して、今度はトランザクション側を主と見てグループ集計する物である。本来は単一テーブルに対して使うのがメインなのかもしれない。

  1. using (PubsDataContext pubs = new PubsDataContext())  
  2. {  
  3.     pubs.Log = Console.Out;  
  4.     var titleSales = pubs.sales.GroupBy(s => s.title_id)  
  5.                                .Select(g => new  
  6.                                {  
  7.                                    title = g.First().titles.title,  
  8.                                    sumPrice = g.Sum(s => s.qty * s.titles.price)  
  9.                                });  
  10.     form.dataGridView1.DataSource = titleSales;  
  11. }  
  12. MessageBox.Show("sales合計を表示しました。次にorder合計を表示します。");  
  13. using (NorthWindDataContext nwnd = new NorthWindDataContext())  
  14. {  
  15.     var orderSum = nwnd.Order_Details.GroupBy(od => od.OrderID)  
  16.                                      .Select(g => new  
  17.                                      {  
  18.                                          OrderID = g.Key,  
  19.                                          SumPrice = g.Sum(od => od.UnitPrice * od.Quantity)  
  20.                                      });  
  21.     form.dataGridView1.DataSource = orderSum;  
  22. }  

後半部分は参考までに単一テーブル(Order_Details)でのグループ集計を付け加えた。


マスターからみて集計した場合とトランザクションから見て集計した場合で基本的には同じ結果が得られるのだが、ちょっとだけ違うところがある。
当然のことながらトランザクション側から見た場合は一つも売れていないtitleは表示されないことになる。


また、7行目と8行目で2度titleテーブルを参照しているためにそれぞれがサブクエリーとなってしまってSQL的には(素人の私がみても)よろしくないことが判る。
もう少しベターな書き方がありそうだが、ここではあくまでもGroupByの使い方がメインなので良しとする。


このように簡単なコーディングからすごく複雑なSQLが発行されてしまうことには閉口する部分もあり、感嘆する部分もありといった感じ。


業務プログラムなどでは、いちいち発行されるSQLを確認しながらじゃなと使えないとなれば、最初から自分でSQLを組んだほうが良いという人も居るだろう。
完全にブラックボックス化されていない技術は確かに使いづらい。
ASP.NETを使ったときにもそのような感じがした。


ただし、完璧なものじゃないと使わない。
原始的に全部自分でやるのがベスト。
とも思わない。


ケースバイケースで適した技術を選択していくのが正しい姿ではなかろうか。


私自身はマイツール的なものやせいぜい身内で使うちょっとしたシステムくらいしか作らないお気楽プログラマーなので、今回のサンプル程度の労力で正しい結果が得られるのであれば十分使える局面はあると思っている。

0 件のコメント:

コメントを投稿

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