使用一个查询从一个 Linq 中的 2 个不同表中选择总和

本文关键字:一个 选择 Linq 查询 中的 | 更新日期: 2023-09-27 18:33:14

我有两个表

Incomes:
[Id]
[AmountOfMoneyEarnt]
[Date]
[AccountId]

Spendings
[Id]
[AmountOfMoneySpent]
[Date]
[AccountId]

我想在 C# 中创建一个 LINQ 查询来获取总收入总和总支出总和,但我想在一次往返中查询。显然,我想知道帐户余额,总收入 - 总支出与一个SQL服务器往返。这可能吗?

谢谢!

使用一个查询从一个 Linq 中的 2 个不同表中选择总和

为了在一次往返中执行此操作,您可以使用 LINQ Concat 运算符,该运算符相当于常见匿名类型投影上的 SQL UNION ALL,包括帐户 ID 和金额(收入为正,支出为负),按帐户对结果进行分组并像这样计算余额

var query = 
    db.Incomes.Select(i => new { AccountId = i.AccountId, Amount = i.AmountOfMoneyEarnt })
    .Concat(
    db.Spendings.Select(s => new { AccountId = s.AccountId, Amount = -s.AmountOfMoneySpent })
    )
    .GroupBy(e => e.AccountId)
    .Select(g => new { AccountId = g.Key, Balance = g.Sum(e => e.Amount) });

如果您只需要特定帐户的余额,那么可能是这样的

var accountId = ...;
var accountBalance = 
    db.Incomes.Where(i => i.AccountId == accountId).Select(i => i.AmountOfMoneyEarnt)
    .Concat(
    db.Spendings.Where(s => s.AccountId == accountId).Select(s => -s.AmountOfMoneySpent)
    )
    .DefaultIfEmpty()
    .Sum();

如果表根本不相关,并且您想要选择一个 sclar 值:

var totalIncomesAndSpendings = new { 
    TotalIncomes = db.Incomes.Sum(x => x.AmountOfMoneyEarnt),
    TotalSpendings = db.Spendings.Sum(x => x.AmountOfMoneySpent)
};
var result = new { 
    TotalIncomes = totalIncomesAndSpendings.TotalIncomes,
    TotalSpendings = totalIncomesAndSpendings.TotalSpendings,
    AccountBalance = totalIncomesAndSpendings.TotalIncomes - totalIncomesAndSpendings.TotalSpendings
};

我想在一笔交易中被查询

您可以将其包装在TransactionScope中:

using (var transaction = new TransactionScope())
{
   // ...
}