以下の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 件のコメント:
コメントを投稿