2010-12-14 87 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) 
     }; 
}