Linq GroupBy and multiple columns

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

Sorry pretty far-fetched example.

How do I get an employee team in GetEmployeeExpenses? I guess I need a second group, but I can't parse the syntax.

Please note that for this employee they Teamwill always be the same anyway, so I’m happy to take Team, for example, the first grouped by record.

So...

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

=>

EmployeeExpense { EmployeeId = 1, Team = Sales, Cost = 150 }
+3
source share
2 answers

In your particular case, you can use x.First().Teaminside your choice to get information about your team.

, , . ,

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

+9

( , ):

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

Source: https://habr.com/ru/post/1780205/


All Articles