Linq GroupBy и несколько столбцов - PullRequest
3 голосов
/ 14 декабря 2010
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)
                );
}

Извините за довольно надуманный пример.

Как мне получить команду сотрудников в GetEmployeeExpenses? Я предполагаю, что мне нужна вторая группа, но я не могу понять синтаксис.

Обратите внимание, что для данного сотрудника их Team всегда будет одинаковым, поэтому я был бы рад взять Team, например, первого сгруппированного по записи.

так ...

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

=>

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

Ответы [ 2 ]

9 голосов
/ 14 декабря 2010

В вашем конкретном случае вы можете использовать x.First().Team внутри вашего Select, чтобы получить информацию о вашей команде.

В других случаях необходимости группировать по нескольким полям вы можете группировать по анонимному типу. Такие как

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

0 голосов
/ 14 декабря 2010

Версия его выражения запроса ( может будет легче читать, в зависимости от ситуации и количества групп):

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