[英]Linq with join, sum and group by C#
我在下面給出了兩個表格: 表 01:收入。
Id | Amount | Date | UserId
1 | 50000 | 2019-01-10 | 1
1 | 10000 | 2019-01-15 | 1
1 | 15000 | 2019-02-16 | 1
1 | 20000 | 2019-03-01 | 1
表 02:費用。
Id | Amount | Date | UserId
1 | 10000 | 2019-03-24 | 1
1 | 5000 | 2019-03-24 | 1
1 | 30000 | 2019-04-24 | 1
1 | 20000 | 2019-05-24 | 1
我想把每個月的收入和支出放在一起。 實際上我想要的結果是這樣的(基於上面的表格):
Month | Income | Expenses
01 | 60000 | 0
02 | 15000 | 0
03 | 20000 | 15000
04 | 0 | 30000
05 | 0 | 20000
到目前為止我已經嘗試過:
var incomes = await _context.Incomes.Where(i => i.Date.Year == year && i.UserId == id && i.IsApproved).ToListAsync();
var expenses = await _context.Expenses.Where(e => e.Date.Year == year && e.UserId == id && e.IsApproved).ToListAsync();
var yearlyIncomes = incomes.GroupBy(
i => i.Date.Month,
i => i.Amount,
(month, income) => new { Month = month, Income = income.Sum() }).OrderBy(i => i.Month).ToList();
var yearlyExpenses = expenses.GroupBy(
e => e.Date.Month,
e => e.Amount,
(month, expense) => new { Month = month, Expense = expense.Sum() }).OrderBy(e => e.Month).ToList();
這樣,我就可以單獨得到每個月的收入和支出。
我也試過:
var yearlyIncomes = incomes.GroupBy(x => x.Date.Month)
.Select(x => new
{
Month = x.Key,
Income = x.Sum(p => p.Amount),
Expense = expenses.Where(c => x.Any(p => p.Date.Month == c.Date.Month)).Sum(c => c.Amount)
}).ToList();
有什么方法可以通過一個查詢獲得所需的結果。
提前致謝。
您希望在通過調用ToListAsync()
方法實現它們之前合並所有數據並對其進行分組。
var incomes = _context
.Incomes
.Where(i => i.Date.Year == year && i.UserId == id && i.IsApproved)
.Select(i => new { Month = i.Date.Month, Income = i.Amount, Expense = 0 });
var expenses = _context
.Expenses
.Where(e => e.Date.Year == year && e.UserId == id && e.IsApproved)
.Select(e => new { Month = e.Date.Month, Income = 0, Expense = e.Amount });
var summary = await incomes
.Concat(expenses)
.GroupBy(s => s.Month)
.Select(g => new { Month = g.Key, Incomes = g.Sum(x => x.Income), Expenses = g.Sum(x => x.Expense) })
.ToListAsync();
UserId
這個
var groupedIncome = incomes
.GroupBy(inc => inc.Date.Month) //group it by month
.Select(groupedIncomeByMonth =>
new {
Month = groupedIncomeByMonth.Key,
Amount = groupedIncomeByMonth
.Sum(monthIncome => monthIncome.Amount),
IsIncome = true}).ToList(); // Marker for Concat/Union All
var groupedExpenses = expenses
.GroupBy(exp => exp.Date.Month)
.Select(groupedExpenseByMonth =>
new {
Month = groupedExpenseByMonth.Key,
Amount = groupedExpenseByMonth
.Sum(monthExpense => monthExpense.Amount),
IsIncome = false }).ToList(); // marker for Concat/Union All
var result = groupedIncome.Concat(groupedExpenses)
.GroupBy(x => x.Month)
.Select(r =>
new {
Month = r.Key,
Income = r.Where(p => p.IsIncome).Sum(g => g.Amount),
Expense = r.Where(p => !p.IsIncome).Sum(g => g.Amount)
}).ToListAsync();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.