【发布时间】:2020-01-24 02:39:06
【问题描述】:
我在下面给出了两个表格: 表 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();
有什么方法可以通过一个查询获得所需的结果。
提前致谢。
【问题讨论】:
-
第二个查询效率不高,因为它将尝试每月获取一次费用。您的第一种方法看起来不错(有时越多越好)。您可以做的一件事是在用户 ID 上加入收入和支出,然后按月进行分组以获得收入和支出。此外,您的分组方式看起来很奇怪,您应该按月分组并汇总收入/费用。
-
使用异步调用,您无需在一个查询中完成。通过在不等待的情况下调用它们来“同时”执行这两个查询。使用
Task.WhenAll等待两个查询,然后计算所需的结果。 -
@ArfizurRahman 希望你能试试我的回答
-
@GabrielLlorico 感谢您的回答。我试过了,但它不工作。我得到的不是我想要的结果。例如:如果您查看我的问题中的示例输出表,则第三个月的收入和支出只有一行,但根据您的解决方案,我在第 3 个月得到两行。即收入和支出应该在同一行。谢谢
-
@ArfizurRahman,我明白了,我忘了重新组合,等待,更新我的答案