ページ

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のグループ集計処理
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 件のコメント:

コメントを投稿

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