LINQ 中的 GroupBy 与字符串 [] 数组

GroupBy in LINQ with string[] array

我正在开发数据库应用程序,它通过标签显示清晰的交易报告。

这是我的旧数据库

Title      Amount       TagsReport (string[] array)
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(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.TagsReport.Select(tag => new
    {
        Tag = tag,
        Amount = item.Amount
    }))
    .GroupBy(tagAmount => tagAmount.Tag)
    .Select(tagAmountGroup => new
    {
        Tag = tagAmountGroup.Key,
        TotalAmount = tagAmountGroup.Sum(tagAmount => tagAmount.Amount)
    })
});

我得到了我想要的输出。

现在我们已经从数据库中删除了标题。所以 db 现在就像,

Amount       TagsReport (string[] array)
5            "Hotel","Friends"
6            "Hotel"
8            "Hotel","Mobile"
9            "Electricity"
8            "Party"

现在我将按标签单独对所有交易进行分组,如下所示:

Amount       Title
19           Hotel
5            Friends
8            Mobile
9            Electricity
8            Party

请帮帮我。

有了新的要求,它变得简单多了。

如果您的数据是这样开始的:

var ReportListQuery = new []
{
    new { Amount = 5, TagsReport = new [] { "Hotel", "Friends" } },
    new { Amount = 6, TagsReport = new [] { "Hotel" } },
    new { Amount = 8, TagsReport = new [] { "Hotel", "Mobile" } },
    new { Amount = 9, TagsReport = new [] { "Electricity" } },
    new { Amount = 8, TagsReport = new [] { "Party" } },
};

那么这是您需要的查询:

var ReportingData =
    from report in ReportListQuery
    from tag in report.TagsReport
    group report.Amount by tag into gtags
    select new
    {
        Title = gtags.Key,
        Amount = gtags.Sum(),
    };

我得到的结果是这样的:

附带说明一下,在您的原始查询中,您使用的是百分比数字的整数数学。这是行不通的,每个数字都会给你零。您需要更改此行:

Percentage = Math.Round((itemGroup.Sum(item => item.Amount) / MonthExpense) * 100),

对此:

Percentage = Math.Round(itemGroup.Sum(item => item.Amount) * 100.0m / MonthExpense),

这将使它使用 decimal 而不是 int 并为您提供正确的结果。