2016-06-29 84 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)), 
      });