Linq帐户层次结构向下钻取

时间:2018-01-17 19:50:32

标签: c# asp.net-mvc linq asp.net-mvc-5

我有两个表,一个是发票表,另一个是发票上帐户的层次表

发票表:

| InvoiceNo| AccNo| InvoiceAmount |
--------------------------------------
| A1234| 345| 100.00   |
| A1235| 346| 95.00    |
| A1236| 347| 15.50    |
| A1237| 348| 20.10    |

层次结构表

| AccNo| HierAccNo| Level|
--------------------------------------
| 123|    | 1    |
| 789| 123| 2    |
| 890| 123| 2    |
| 345| 789| 3    |
| 346| 789| 3    |
| 347| 890| 3    |
| 348| 890| 3    |

我尝试做的是将发票表中的金额汇总到最高级别的AccNo(级别1),然后将最高级别的实例从最高帐号回滚到下一级别。< / p>

到目前为止,我可以通过以下方式累计到最高的乐队编号:

                var BandL2 = from invoice in db.Invoices//Roll up to level 2
                         join ban in db.HierarchyTable
                         on invoice.AccNo equals ban.Ban
                         where invoice.GlobalInvoiceID == globalInvoice.Id
                         group invoice by ban.HierAccNo into bandHierarchy
                         select new
                         {
                             Level2Band = bandHierarchy.Key,
                             Amount = bandHierarchy.Sum(m=> m.InvoiceAmount)
                         };

            var bandHierarchyTable = db.HierarchyTable.AsQueryable();

            var BandL1 = from band2 in BandL2 // Roll Up to level 1
                         join band1 in bandHierarchyTable
                         on band2.Level2Band equals band1.Ban
                         group band2 by band1.HierAccNo into bandL1
                         select new
                         {
                             Level1Band = bandL1.Key,
                             Amount = bandL1.Sum(m => m.Amount)
                         };

但是现在我有一个问题正在逆转这个过程并从第1级向下钻取,因为表单中的唯一细节是第1级的AccNo(例如123)。 我正在尝试使用弹出模式动态执行此操作,因为我正在钻井。

如何再次向下钻取以便我可以逐级获取金额? 例如:

以上代码中的输出表

| AccNo| Amount|
--------------------------------------
| 123| 230.60 | 

然后

| AccNo| Amount|
-------------------------------------- 
| 789| 195  | 
| 890| 35.60| 

然后点击其中一个AccNo。

| AccNo| Amount|
-------------------------------------- 
| 345| 100| 
| 346| 95 | 

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来只有叶子帐户可以附加发票,所以获取帐号,检查它是否是叶子帐户,如果它是叶子它应该是这样的;

var hierAccNo = 123;
var details =  from invoice in db.Invoices
                         join ban in db.HierarchyTable
                         on invoice.AccNo equals ban.Ban
                         where invoice.GlobalInvoiceID == globalInvoice.Id
and ban.HierAccNo = HierAccNo;

如果它不是叶子你想要你在1级的原始查询,我想得到小计。

var BandL2 = from invoice in db.Invoices//Roll up to level 2
                         join ban in db.HierarchyTable
                         on invoice.AccNo equals ban.Ban
                         where invoice.GlobalInvoiceID == globalInvoice.Id and ban.HierAccNo = hierAccNo // dont skip this

                         group invoice by ban.HierAccNo into bandHierarchy
                         select new
                         {
                             Level2Band = bandHierarchy.Key,
                             Amount = bandHierarchy.Sum(m=> m.InvoiceAmount)
                         };