使用一个查询从一个 Linq 中的 2 个不同表中选择总和
本文关键字:一个 选择 Linq 查询 中的 | 更新日期: 2023-09-27 18:33:14
我有两个表
Incomes:
[Id]
[AmountOfMoneyEarnt]
[Date]
[AccountId]
和
Spendings
[Id]
[AmountOfMoneySpent]
[Date]
[AccountId]
我想在 C# 中创建一个 LINQ 查询来获取总收入总和总支出总和,但我想在一次往返中查询。显然,我想知道帐户余额,总收入 - 总支出与一个SQL服务器往返。这可能吗?
谢谢!
为了在一次往返中执行此操作,您可以使用 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())
{
// ...
}