我正在处理数据库应用程序,该应用程序通过其标记显示交易的清晰报告。
这是我的数据库。
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)
}))
});
输出就像;
Percentage Title Amount
53% Food 19
Hotel 5
Friends 5
Hotel 6 //Hotel should be grouped here and should with the value 11 :-(
Party 8
57% Family 17
Hotel 8
Mobile 8
Electricity 9
但我的期望输出是:
Percentage Title Amount
53% Food 19
Hotel 11
Friends 5
Party 8
57% Family 17
Hotel 8
Mobile 8
Electricity 9
如你所见,我做了一切。但不是' hotel'分组在报告中。我究竟做错了什么?请指教!
答案 0 :(得分:2)
我赞同Chris Cummings'关于分组误用的观察。因为您不会变平(即在SelectMany()
字段上调用TagsReport
,直到您只有一个项目为止,因此对每个展平的序列只对一个组进行分组。
根据您所说的所需输出,您似乎只有一个错位的右括号。你应该写这个:
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
})) // add parenthsis here
.GroupBy(tagAmount => tagAmount.Tag)
.Select(tagAmountGroup => new
{
Tag = tagAmountGroup.Key,
TotalAmount = tagAmountGroup.Sum(tagAmount => tagAmount.Amount)
}) // remove parenthesis here
});
换句话说:你想要在每个"按标题分组"中分组整个扁平的项目序列。分组,而不是压扁每个组中的每个单独项目。我只是删除了倒数第二行的第二个)
,并在第二个GroupBy()
调用之前添加了一个。{/ p>
这会产生您描述的输出。它仍然很奇怪(单个标签金额的总和超过了每个标题组的总费用),但至少它是你特别要求的。 :)(好吧,不计算百分比......根据示例数据,没有办法让百分比加起来的MonthExpense
值,所以我只是没有尝试使这个数字出来正确)。
答案 1 :(得分:0)
在我看来,你的第二组是按项目完成的,而不是标签组。所以,你按标题分组;说,食物。该组现在有三个项目。 "酒店,朋友" - "酒店" - "派对"。现在,对于这些组中的每一个,您都可以通过on tag进行分组。那么每个组只有一个。因此,您可以看到酒店,朋友,酒店,派对。在我看来,你并没有在整个集合中做一个小组,你在小组的每个成员上做了一个小组。您可能希望将原始组存储到变量中,然后对该数据集的结果求和。当然,只对具有相同标签的项目进行汇总。