我有兩個表:用戶和事務。交易表存盤用戶錢包交易( 余額,-余額)等。我試圖根據他們錢包的當前余額按最大的優先順序獲取用戶串列。Amount(我可以通過對表中的列求和來獲得總余額Transactions)。
var query = from u in _context.users
join t in _context.Transactions on u.id equals t.UserId into gj
from txn in gj.DefaultIfEmpty()
where txn.TransactionStatus == Transaction.Status.Success && !u.Deleted.HasValue
select new
{
balance = gj.Sum(a => a.Amount),
user = u,
};
var result = await query.OrderByDescending(t => t.balance).Skip(offset).Take(range).ToListAsync();
我收到錯誤訊息:
無法翻譯 LINQ 運算式“gj”。
這是我試圖實作的等效 SQL:
SELECT balance, u.* FROM
(SELECT COALESCE(SUM(Amount), 0) as balance, u.id
FROM dbo.users u
LEFT JOIN dbo.Transactions t ON(u.id = t.UserId AND t.TransactionStatus = 0)
WHERE u.Deleted IS NULL
GROUP BY u.id) as tbl
JOIN dbo.users u ON(u.id = tbl.id)
ORDER BY balance DESC
uj5u.com熱心網友回復:
從用戶開始并使用導航道具進入 Trans 應該使這變得微不足道。試一試:
users.Where(u => u.Deleted == null)
.Select(u => new {
User = u,
Balance = u.Transactions.Where(t => t.Status == 0).Sum(t => t.Amount)
})
.OrderByDescending(at => at.Balance);
如果邏輯真的是“列出所有用戶,但只為未洗掉的用戶添加交易,并將已洗掉的用戶顯示為 0 余額”,那么:
users.Where(u => u.Deleted == null)
.Select(u => new {
User = u,
Balance = u.Deleted != null ? 0 : u.Transactions.Where(t => t.Status == 0).Sum(t => t.Amount)
})
.OrderByDescending(at => at.Balance);
盡量不要撰寫 EF 查詢,例如“對,在 SQL 中我將擁有這個表并加入那個表,它會是一個左連接,這將被求和......所以我會告訴 EF 做這個背景關系集加入該背景關系集,它是一個左連接,并且總和......” - EF 將為您撰寫連接;根據您希望如何操作 C# 物件圖來表達您的要求,并讓 EF 盡可能地轉換為 SQL;使用物體之間的導航道具,以便它可以確定您希望如何將資料組合在一起并安排必要的連接。它很少需要以 SQL 風格的方法進行微觀管理
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/481533.html
上一篇:加入的附加條件
