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

Excusez l'exemple plutôt artificiel.Linq GroupePar et plusieurs colonnes

Comment puis-je obtenir l'équipe d'employés au GetEmployeeExpenses? Je suppose que j'ai besoin d'un deuxième groupe mais je ne peux pas travailler sur la syntaxe.

Notez que pour un employé donné, leur Team sera toujours le même de toute façon, donc je serais heureux de prendre le Team de par exemple le premier groupé par enregistrement.

so ...

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

=> 

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

Répondre

9

Dans votre cas, vous pouvez utiliser x.First().Team dans votre Sélectionnez pour obtenir les informations de votre équipe.

Pour les autres cas de regroupement réel sur plusieurs champs, vous pouvez regrouper sur un type anonyme. Tels que

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

+0

+1 Bonne réponse indiquant qu'il pourrait utiliser 'First' pour son problème. –

+0

merci, excellente réponse – fearofawhackplanet

0

version Expression de la requête de celui-ci (pourrait plus facile à lire, selon la situation et la quantité de groupement):

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) 
     }; 
}