2017-01-31 22 views
0

これはおそらくLINQプロのスナップですが、これは私の基本容量を超えています。LINQ複雑な親/子/親/子関係にわたるクエリ

Stores { Storeid, Description } 
ShoppingDays { ShoppingDayid, Date, Storeid } 
Transactions { Transactionid, Amount, ShoppingDayid, PaintColorid } 
PaintColors { PaintColorid } 
DyeAllocations { DyeAllocationid, PaintColorid, Percent, DyeId } 
Dyes { DyeId, Name } 

店舗、ShoppingDays、とトランザクションテーブルは単純明快であり、コメントは必要ありません。私たちは、Entity Frameworkのを介してアクセスし6つのテーブルを持っています。しかし、各取引では単一の色の塗料が購入されます。塗料の各色は、100%になる色の染料の割合の混合物で構成されています。

私は各店舗で毎日各染料に費やされたすべてのドルを合計したいと思います。ファインペイント(40%レッド、40%ブルー、20%ブラック)とピンクペイント(20%レッド、80%ホワイト)の20ドルの購入のための30ドルの1つの取引を想像してみてください。結果は

Store1,1、レッド、$ 16
Store1,1、ブルー、$ 12
Store1,1、ブラック、$ 6
Store1,1、ホワイト、$ 16

のような任意の助けを見てしまうだろう最も高く評価されます。私はどこから始めたらいいのか分からない。私はすべてのテーブルを内部結合し、データをエクセルピボットテーブルに入れてデータを抽出しました。明らかにそれは正しくありません。

私は以下から始めました。各取引ごとに各染料の購入を示す表を提供します。それぞれの店舗や買い物日の購入額を合計したいと思いますが、どうすればよいか分かりません。

var dyeValues = (from store in db.stores 
          join sd in db.shoppingdays on store.storeId equals sd.storeId 
          join tr in db.transactions on sd.shoppingdayId equals tr.shoppingdayId 
          join pc in db.paintcolors on tr.paintcolorId equals pc.paintcolorId 
          join da in db.dyeallocations on pc.paintcolorId equals da.paintcolorId 
          where da.percent > 0.0m 
          select new 
          { 
           store.Description, 
           shoppingdayDate = sd.Date, 
           da.dye.Name, 
           da.percent, 
           Allocation = da.percent * tr.Amount 
          }); 
+1

「Paintid」はどこですか?これはどこに行くのですか?また、少なくとも、あなたが試したことを私たちに教えてください。 –

+0

申し訳ありませんが、PaintIdはPaintColorIdだったはずです。正直なところ、すべてのテーブルをフラットに内部結合し、Excelでピボットテーブルを使用したいデータを抽出しました。それを超えて、私はdb.stores.selectmany(st => st.shoppingdays).selectmany(sd => sd.transactions)などから始めました...しかし、これは正しいアプローチではないことが分かりました。 私は染料や塗料ではじめて、逆に作業するべきでしょうか? – jlear

+1

こんにちは@jlear、Stackoveflowは、私はこのデータを持っていると言うことができる場所ではない、私はそれからそれをしたい。あなたはあなたの側にいくつかの努力を示す必要があります。チェックしてください:http://stackoverflow.com/help/how-to-ask – bit

答えて

2

ここでは、古典的なSQLの方法と同じです。 {ShoppingDayId, DyeId}によってグループとは、計算するサブクエリ

まずSum(Percent * Amount)

var dyeAllocations = 
    from tr in db.Transactions 
    join pc in db.PaintColors on tr.PaintColorId equals pc.PaintColorId 
    join da in db.DyeAllocations on pc.PaintColorId equals da.PaintColorId 
    where da.Percent > 0.0m 
    group new { Allocation = da.Percent * tr.Amount } 
    by new { tr.ShoppingDayId, da.DyeId } into g 
    select new { g.Key.ShoppingDayId, g.Key.DyeId, Allocation = g.Sum(e => e.Allocation) }; 

次に必要な追加情報を取得するために、他のテーブルに参加する:

サブクエリは実際のクエリに埋め込むことができ
var dyeValues = 
    from da in dyeAllocations 
    join dye in db.Dyes on da.DyeId equals dye.DyeId 
    join sd in db.ShoppingDays on da.ShoppingDayId equals sd.ShoppingDayId 
    join store in db.Stores on sd.StoreId equals store.StoreId 
    select new 
    { 
     store.Description, 
     sd.Date, 
     dye.Name, 
     da.Allocation 
    }; 

私は読みやすさのために別の変数を使用しました(EF生成SQLクエリには影響しません)。また、実際のモデルと一致するようにフィールド名/ケーシングを更新する必要があるかもしれませんが、これはあなたに考えを与えるはずです。

+0

ありがとうIvan。私はそれを試してみましょう。 – jlear

+0

イワンに釘付け!私はあなたのグループのステートメントを取って、私の参加を追加することによって、あなたの2つのクエリを組み合わせた。それはひどく遅いですが、今私はこのことについてどのようにグループ化するのか知っています。本当にありがとう! – jlear

0

Ivanの答えを1つのクエリに変更しました。非常に遅いですが、機能します!

var deyValues = from cs in account.stores 
     join sd in db.shoppingdays on cs.storeId equals sd.storeId 
     join tr in db.transactions on sd.shoppingdayId equals tr.shoppingdayId 
     join pc in db.paintcolors on tr.paintcolorId equals pc.paintcolorId 
     join da in db.dyeallocations on pc.paintcolorId equals da.paintcolorId 
     where da.AfterTaxOptimalPortion > 0.0m 
     group new { Allocation = da.Percent * tr.Amount } 
     by new { AccountName = cs.Account.Name, ShoppingDate = sd.Date, DyeName = da.dye.Name } into g 
     select new { g.Key.AccountName, g.Key.ShoppingDate, g.Key.DyeName, Total = g.Sum(el => el.Allocation) };