2010-12-14 79 views
3
class ExpenseClaim 
{ 
    int EmployeeId; 
    int Team; 
    double Cost; 
} 


List<EmployeeExpense> GetEmployeeExpenses() 
{ 
    return _expenseClaims // `_expenseClaims` is `List<ExpenseClaim>` 
      .GroupBy(e => e.EmployeeId) 
      .Select(x => 
       new EmployeeExpense(
         x.Key, 
         // TODO: employee team? 
         x.Sum(e => e.Cost) 
       ); 
} 

请原谅这个颇为人为的例子。Linq GroupBy和多列

如何获得GetEmployeeExpenses的员工团队?我假设我需要第二组,但我无法弄清楚语法。

请注意,对于给定的员工,他们的Team将总是相同的,所以我很乐意拿Team,例如按记录分组的第一个。

所以......

ExpenseClaim { EmployeeId = 1, Team = Sales, Cost = 100 } 
ExpenseClaim { EmployeeId = 1, Team = Sales, Cost = 50 } 

=> 

EmployeeExpense { EmployeeId = 1, Team = Sales, Cost = 150 } 

回答

9

你的具体情况,你可以使用x.First().Team里面你选择,让您的团队信息。

对于其他需要在多个字段上进行分组的情况,可以使用匿名类型进行分组。如它

someQuery.GroupBy(f => new { f.Foo, f.Bar }).Select(...);

+0

+1很好的回答指出,他可以使用他的问题“首先”。 – 2010-12-14 13:13:26

+0

谢谢你,优秀的答案 – fearofawhackplanet 2010-12-14 13:15:23

0

查询表达式版本(可能更容易阅读,这取决于形势和分组量):

IEnumerable<EmployeeExpense> GetEmployeeExpenses(List<ExpenseClaim> claims) 
{ 
    return 
     from c in claims 
     group c by c.EmployeeId into groupedById 
     from g in groupedById 
     group g by g.Team into groupedByTeam 
     let firstElement = groupedByTeam.First() 
     select new EmployeeExpense { 
      EmployeeId = firstElement.EmployeeId, 
      Team = firstElement.Team, 
      Cost = groupedByTeam.Sum(e => e.Cost) 
     }; 
}