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
并为您提供正确的结果。
我正在开发数据库应用程序,它通过标签显示清晰的交易报告。
这是我的旧数据库。
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
并为您提供正确的结果。