Fra*_*nko 3 linq aggregate sum
我是linq的新手,我需要帮助.我有一个带有金额字段的交易表,我希望将金额字段拆分为借方和贷方.与以下sql查询等效的linq是什么:选择sum(Amount <0?Amount:0)作为Debit,sum(Amount> 0?0:Amount)作为来自Account = strAccount的交易的Credit.
Jon*_*eet 10
不幸的是,没有简单的方法在单个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);
Run Code Online (Sandbox Code Playgroud)
或者:
var credit = accountTransactions.Sum(t => Math.Max(t.Amount, 0));
var debit = accountTransactions.Sum(t => Math.Min(t.Amount, 0));
Run Code Online (Sandbox Code Playgroud)
我不能保证这些都会在(比如)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)) };
Run Code Online (Sandbox Code Playgroud)
当然,你现在可以使用:
var myTransactions = query.Where(result => result.Account.AccountId == accountID)
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
然后,这将是单个SQL语句,返回单个结果,如果找不到该帐户ID,则返回null.同样,你必须看看它是如何实际转换为SQL的.