如何在linq中进行聚合查询

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的.