以下のstores,sales,titlesテーブル間で、店ごとの売上グループ集計処理を考えてみる。
テーブルの関係はstoresとsalesが1対多。salesとtitlesが多対1である。
salesテーブルに売上を持っていれば、これまでやったようにstoresテーブルから手繰ってSUM拡張メソッドでsalesの売上を合計するだけだ。
しかし、salesには数量とtitle_idだけがあり、titleの単価はtitlesテーブルに持っているので、salesからまたその先のtitlesまで手繰らないといけない。
以下のような感じになる。
- //1対多対1のグループ集計処理
- public void linqGroup1Many1(Form1 form)
- {
- using (PubsDataContext pubs = new PubsDataContext())
- {
- pubs.Log = Console.Out;
- var salesByStore = pubs.stores.Select(st => new
- {
- st.stor_id,
- st.stor_name,
- salesSum = st.sales.Sum(sls => sls.qty * sls.titles.price)
- });
- form.dataGridView1.DataSource = salesByStore;
- }
- }
salesオブジェクトのtitlesプロパティからpriceを手繰って持ってこれるのでそれ程難しいことはなさそうだ。(以前のグループ集計処理とほとんど同じ)
埋め込みクエリー方式では以下のとおり。
- //1対多対1のグループ集計処理
- public void linqGroup1Many1(Form1 form)
- {
- using (PubsDataContext pubs = new PubsDataContext())
- {
- var salesByStore = from st in pubs.stores
- select new
- {
- st.stor_id,
- st.stor_name,
- salesSum = st.sales.Sum(sls => sls.qty * sls.titles.price)
- };
- form.dataGridView1.DataSource = salesByStore;
- Console.Beep();
- }
- }
0 件のコメント:
コメントを投稿