2014-01-10 37 views
0

也有类似的问题,但我找不到解决方案。我有一个非常简单的对象定义。我需要一个查询,返回按标签分组的金额总和。LINQ:从内部列表中分组得到总和

预期输出:

TagName   Sum 
-------------------- 
Entertainment 70.00 
Car   20.00 
Travel   24.65 

Account类:

public string AccountName {get;set;} 
public List<Transaction> Transactions {get;set;} 

试用帐户:我的钱包

交易类:

public decimal Amount {get;set;} 
public List<Tag> Tags{get;set;} 

样品交易10 , [Entertainment, Travel, Car]

Tag类

public string Title {get;set;} 

样品标签Entertainment, Travel, Car, Food, Beverage

我希望这是清楚的。我无法使用LINQ。我需要帮助

回答

5

将每笔交易记录到{ Amount, Title }对象的序列中。比组这些对象通过标签和计算量的总和为每个组:

account.Transactions 
     .SelectMany(t => t.Tags.Select(tag => new { t.Amount, tag.Title })) 
     .GroupBy(tagAmount => tagAmount.Title) 
     .Select(g => new { 
      TagName = g.Key, 
      Sum = g.Sum(tagAmount => tagAmount.Amount) 
     }); 

注意:此解决方案假定您没有在交易重复的标记。否则,应在投射标签集合后添加Distinct()调用。


同样的,查询语法:

var query = from t in account.Transactions 
      from tag in t.Tags 
      select new { t.Amount, tag.Title } into tagAmount 
      group tagAmount by tagAmount.Title into g 
      select new 
      { 
       TagName = g.Key, 
       Sum = g.Sum(tagAmount => tagAmount.Amount) 
      }; 
+1

那是快。它解决了我的问题。 – Murat

+0

顺便提一下,你可以建议任何资源,以提高我的linq技能。 – Murat

+2

@Murat你可以在[Pluralsight](http://pluralsight.com/training/Courses/TableOfContents/linq-fundamentals)视频中找到关于Linq的很棒介绍。 Jon Skeet还将重新实现Linq系列,它将向您解释Linq如何在其中工作。然后练习,练习,练习:) –