2017-06-26 57 views
-2

我有这样计算总使用LINQ列在c#

ID Description Principal Interest Total 
123 Paid  100   150  250 
    Balance  50   50   100 
    Total  ?   ?   ? 
124 Paid  100   150  250 
    Balance  50   50   100 
    Total  ?   ?   ? 

类的结构:

public class APIBillingHistory 
{ 
    public List<APIBillingHistoryDetails> BillingHistoryDetails; 
} 

public class APIBillingHistoryDetails 
{ 
    public string BillId; 
    public string Description; 
    public Decimal Principal; 
    public Decimal Interest; 
    public Decimal Total; 
} 

我想为每列总和值对于每个ID。因此,在上面的例子中,对于,ID 123的Total同样是150,Interest200。我在这里检查了这个解决方案How to create Total column and Total row using LINQ,但无法得到它。

代码:

responseObj = new APIBillingHistory 
{ 
    BillingHistoryDetails = billingHistory.BillingHistoryDetails 
      .GroupBy(detail => new { detail.BillId, detail.Description}) 
      .Select(group => new APIBillingHistoryDetails 
      { 
       BillId = group.Key.BillId, 
       Description = group.Key.Description, 
       Principal = group.Sum(t => t.Principal), 
       Interest = group.Sum(t => t.Interest), 
       Total = group.Sum(t => t.Principal) + group.Sum(t => t.Interest) 
      }).Concat(new APIBillingHistoryDetails 
      { 
       Description = "Total", 
       /* Not sure what to write over here */ 
      }) 
}; 

编辑:

为了澄清什么,我想实现:

  • 我的源记录列表中不包含 “总计” 列& “总计” 行。我想手动添加它。
  • 我能弄清楚如何添加将包含值的总和“总计”列。
  • Principal & Interest将包含decimal格式的值。
  • ID列是整数。我想正在通过聚合基于ID计算,即计算后,应该得到只显示Total行显示总计行每个ID
  • Principal & Interest

有什么建议吗?

+0

对于第二行和第三行,ID列等于什么?一个'Decimal'怎么能成为'?'?你想总结'Total'还是你的意思是'Total'行不在你的源数据中? – NetMage

+0

此外,您的源数据是否已包含每行的“总计”字段,还是必须添加? – NetMage

+0

我想推荐使用名为LinqPad的工具。这就像使用Sql Server Management Studio,但在C#实体上一样。允许您可视化LINQ表达式的结果并真正理解发生了什么。 –

回答

0

由身份

BillId Description Principal Interest 
123 Paid  100   150  
123 Balance  50   50  
124 Paid  100   150  
124 Balance  50   50  

然后,只需组假设当前数据,通过总结分组属性设置描述为“总”创建总目标。

var totalsObj = new APIBillingHistory { 
    BillingHistoryDetails = billingHistory.BillingHistoryDetails 
      .GroupBy(detail => detail.BillId) 
      .Select(g => new APIBillingHistoryDetails { 
      BillId = g.Key, 
      Description = "Total", 
      Principal = g.Sum(detail => detail.Principal), 
      Interest = g.Sum(detail => detail.Interest), 
      Total = g.Sum(detail => detail.Principal) + g.Sum(detail => detail.Interest) 
      }).ToList() 
}; 

totalsObj.BillingHistoryDetails本来期望了把

是经过计算,只有总计行应该得到显示。

BillId Description Principal Interest Total 
123 Total  150   200   350 
124 Total  150   200   350 
1

您不能使用Concat并参考以前的数据。您需要使用SelectMany

BillingHistoryDetails = billingHistory.BillingHistoryDetails 
    .GroupBy(detail => detail.BillId) 
    .SelectMany(bg => bg.Concat(new[] { new APIBillingHistoryDetails { 
     BillId = bg.First().BillId, 
     Description = "Total", 
     Principal = bg.Sum(b => b.Principal), 
     Interest = bg.Sum(b => b.Interest), 
     Total = bg.Sum(b => b.Total) 
    } })); 
+0

我不能避免'Select',因为我正在通过'ID'对'Principal'和'Interest'进行聚合。在做这个聚合后,我想计算每列的总数。 – Shaggy

+0

这在你的问题中并不明显。 – NetMage

+0

已编辑的问题。 – Shaggy