求和组连接时无法翻译 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 风格的方法中进行微观管理
我有两个 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 风格的方法中进行微观管理