2016-06-29 82 views
2

這裏是我的實體結構如何使用LINQ C#中詞典過濾器嵌套集合

Transaction Entity 

TransactionID, CompanyID TransactionItems 
    1    10   List<TransactionItems> 
    2    10   List<TransactionItems> 
    3    20   List<TransactionItems> 

TransactionItems Entity 

TransactionItemID TransactionID Value Postive Negative 
1     2   10 yes 
2     2   20 yes 
3     2   30   yes 
4     3   100   yes  
5     3   200 yes 

I need to sum the values of Value based on positive or negative flag and then compute total like this 

CompanyID Postive Negative 
10   30  30 
20   200 100 

在業務層的函數返回Dictionary<int, List<Transaction>>這基本上是這樣的

Key   Value 
CompanyID, List<Transaction> 

到目前爲止我只有實現了這一點

_Transaction.GetCompanyTransactions(). 
       Select(_Company => new 
       { 
        Company = _Company.Key, 
        Positive = 
        Negative = 
       }); 

任何一個請幫助

+1

你基本上需要'總和''價值',其中你的國旗是'積極/消極'。 –

+1

作爲一個方面說明,應該只有一個'Positive'標記設置爲'True/False'應該可能會更好。 –

回答

4

你只需從列表總結值字段:

_Transaction.GetCompanyTransactions() 
    .Select(g => new { 
     CompanyId = g.Key, 
     Positive = g.Value.SelectMany(t => t.TransactionItems).Where(t => t.Positive).Sum(t => t.Value), 
     Negative = g.Value.SelectMany(t => t.TransactionItems).Where(t => t.Negative).Sum(t => t.Value)}) 
     }); 
+0

'哪裏(t => t.Positive)'不會編譯。 –

+0

我認爲它應該是'_Transaction.GetCompanyTransactions()。Select(g => new {CompanyId = g.Key,Positive = g.Value.Select(s => s.TransactionItems.Where(t => t.Positive) .Sum(t => t.Value)),Negative = g.Value.Select(s => s.TransactionItems.Where(t => t.Negative).Sum(t => t.Value))}); ' – Bruno

+0

是的,我已經更新了我的答案以糾正該問題。 – Kinetic

1

您需要Sum基礎上,Positive/Negative標誌值。

它分兩步完成:首先需要Sum內部項目,然後Sum內部總和。

_Transaction.GetCompanyTransactions() 
      .Select(g => new 
      { 
       Company = g.Key, 
       Positive = g.Value.Sum(t => t.TransactionItems.Where(x => x.Positive).Sum(x => x.Value)), 
       Negative = g.Value.Sum(t => t.TransactionItems.Where(x => x.Negative).Sum(x => x.Value)), 
      });