如何在 LINQ 中使用分组?

How to use Grouping in LINQ?

我只是想把我的问题说清楚。这是我的数据库

Title      Amount       Tags
Food       5            Hotel,Friends
Food       6            Hotel
Family     8            Hotel,Mobile
Family     9            Electricity
Food       8            Party

我希望生成如下报告:

期望输出:

Percentage     Title             Amount
53%            Food              19
                  Hotel             11
                  Friends           5
                  Party             8

57%            Family            17
                 Hotel             8
                 Mobile            8
                 Electricity       9

我对 LINQ 的了解不够。所以我在寻找完美解决方案时遇到了很多麻烦。

我现在使用的代码,

var ReportingData = ReportListQuery.Where(Item => Item.Category == "expense")
                                   .GroupBy(x => new { x.Title, x.TagsReport })
                                   .Select(y => new
                                         {
                                             Percentage = Math.Round((y.Sum(x => x.Amount) / MonthExpense) * 100),
                                             ExpenseTitle = y.First().Title,
                                             ExpenseCalculation = y.Sum(x => x.Amount)
                                          });

这是我的代码的输出:

输出:

Percentage     Title      Amount  
53%            Food       19
57%            Family     17

提前致谢。请帮我。 :-(

据我了解你的问题,你不知道如何获取每个标签的结果,对吗?

首先,我强烈建议在复杂的 LINQ 查询中使用有意义的名称,而不是 x、y 等。另外,在我看来,您按 TagReport 分组,我看不出有什么原因。最后,而不是 y.First().Title 你可以只使用组键。应用这些建议后,您的简化查询如下所示:

var ReportingData = ReportListQuery
    .Where(Item => Item.Category == "expense")
    .GroupBy(item => item.Title)
    .Select(itemGroup => new
    {
        Percentage = Math.Round((itemGroup.Sum(item => item.Amount) / MonthExpense) * 100),
        ExpenseTitle = itemGroup.Key,
        ExpenseCalculation = itemGroup.Sum(item => item.Amount)
    });

现在,要添加每个标签的结果,您可以在包含标签金额列表的匿名类型上生成另一个 属性:

var ReportingData = ReportListQuery
    .Where(Item => Item.Category == "expense")
    .GroupBy(item => item.Title)
    .Select(itemGroup => new
    {
        Percentage = Math.Round((itemGroup.Sum(item => item.Amount) / MonthExpense) * 100),
        ExpenseTitle = itemGroup.Key,
        ExpenseCalculation = itemGroup.Sum(item => item.Amount)
        TotalTagAmounts = itemGroup
            .SelectMany(item => item.Tags.Select(tag => new { Tag = tag, Amount = amount})
            .GroupBy(tagAmount => tagAmount.Tag)
            .Select(tagAmountGroup => new 
            { 
                Tag = tagAmountGroup.Key, 
                TotalAmount = tagAmountGroup.Sum(tagAmount => tagAmount.Amount)
            })
    });