簡體   English   中英

Linq 通過 C# 進行連接、求和和分組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM