求和组连接时无法翻译 C# LINQ 表达式

C# LINQ expression cannot be translated when summing group joins

我有两个 table:用户和交易。交易 table 存储用户钱包交易(+ 余额,- 余额)等。我正在尝试根据最大优先排序的钱包当前余额获取用户列表。 (我可以通过将 Transactions table 中的 Amount 列求和来获得总余额)。

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();

我收到错误:

The LINQ expression 'gj' could not be translated.

这相当于 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

从用户开始,使用导航道具到 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 中,我会使用这个 table 并加入那个 table,这将是一个左联接,并且会求和...所以我会告诉 EF 将这个上下文集加入那个上下文集,这是一个左连接,然后求和...”- EF 会为您编写连接;根据您希望如何操作 C# 对象图来表达您的要求,并让 EF 尽可能地转换为 SQL;在实体之间使用导航道具,这样它就可以计算出您希望如何将数据放在一起并安排必要的连接。它很少需要在 SQL-ey 风格的方法中进行微观管理