2010-12-14 7 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にするにはどうすればよいですか?私は2番目のグループが必要であると仮定していますが、構文を解決できません。

特定の従業員の場合、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良い答え、彼が使用できることを指摘彼の問題のために 'まず'。 –

+0

ありがとう、すばらしい答え – fearofawhackplanet

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) 
     }; 
} 
関連する問題