К сожалению, нет простого способа выражения обоих агрегатов в одном запросе LINQ, подобном тому, когда он извлекает один результат. Два отдельных запроса будут:
// Doesn't actually perform a query yet
var accountTransactions = db.Transactions.Where(t => t.AccountId == accountId);
var credit = accountTransactions.Sum(t => t.Amount > 0 ? t.Amount : 0);
var debit = accountTransactions.Sum(t => t.Amount < 0 ? t.Amount : 0);
Или альтернативно:
var credit = accountTransactions.Sum(t => Math.Max(t.Amount, 0));
var debit = accountTransactions.Sum(t => Math.Min(t.Amount, 0));
Я не могу гарантировать, что они будут иметь переводы (скажем) в LINQ to SQL, но я надеюсь, что они будут.
Если вы находите кредит / дебет для всех учетных записей, вы могли бы сделать это в одном запросе:
var query = from account in db.Accounts
join transaction in db.Transactions
on account.AccountID equals transaction.TransactionID
into trans
select new { Account = account,
Credit = trans.Sum(t => Math.Max(t.Amount, 0)),
Debit = trans.Sum(t => Math.Min(t.Amount, 0)) };
Теперь, конечно, вы можете использовать:
var myTransactions = query.Where(result => result.Account.AccountId == accountID)
.FirstOrDefault();
Тогда будет одним оператором SQL, возвращающим либо один результат, либо ноль, если он не может найти идентификатор этой учетной записи. Опять же, вам нужно увидеть, как это на самом деле переведено в SQL.