簡體   English   中英

Linq GroupBy和多列

[英]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)
                );
}

請原諒相當人為的例子。

如何在GetEmployeeExpenses獲得員工團隊? 我假設我需要第二組,但我無法解決語法問題。

請注意,對於給定的員工,他們的Team總是會保持一致,所以我很樂意以Team為例,按照記錄分組。

所以...

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

=>

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

在您的特定情況下,您可以在Select中使用x.First().Team來獲取您的團隊信息。

對於實際需要在多個字段上進行分組的其他情況,您可以對匿名類型進行分組。

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

查詢它的表達式版本( 可能更容易閱讀,具體取決於情況和分組數量):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM