实体查询中关联多表并获取GLBalances最新日期余额的实现求助
解决三张表关联查询并获取GLBalances最新余额的问题
要实现每个银行账户关联对应GL账户的最新日期余额,核心是先筛选出GLBalances中每个GLAccountGuid对应的最新记录,再和另外两张表关联。以下是两种可行的修改方案:
方案一:在DTO构造时用子查询获取最新余额
直接在查询BankAccounts和Banks的同时,针对每个账户的BankGL单独查询最新余额:
var list = await (from ba in _context.BankAccounts join bnk in _context.Banks on ba.BankId equals bnk.ID select new BankAccountDto() { BankId = ba.BankId, AccountNumber = ba.AccountNumber, BankName = bnk.BankName, Notes = ba.Notes, Description = ba.Description, // 替换DateField为GLBalances表实际的日期字段名 Balance = (decimal)_context.GLBalances .Where(gl => gl.GLAccountGuid == ba.BankGL) .OrderByDescending(gl => gl.DateField) .Select(gl => gl.ClosingBalance) .FirstOrDefault() }).ToListAsync();
如果存在某账户无GL余额记录的情况,可以加空值处理:Balance = glB?.ClosingBalance ?? 0(根据业务需求调整默认值)。
方案二:先预处理GLBalances的最新记录再关联
先通过分组排序拿到每个GL账户的最新余额记录,再和另外两张表关联,适合数据量较大的场景:
// 先获取每个GLAccountGuid对应的最新余额记录 var latestGlBalances = _context.GLBalances .GroupBy(gl => gl.GLAccountGuid) .Select(g => g.OrderByDescending(gl => gl.DateField).FirstOrDefault()) .Where(gl => gl != null); // 关联三张表查询 var list = await (from ba in _context.BankAccounts join bnk in _context.Banks on ba.BankId equals bnk.ID join glB in latestGlBalances on ba.BankGL equals glB.GLAccountGuid select new BankAccountDto() { BankId = ba.BankId, AccountNumber = ba.AccountNumber, BankName = bnk.BankName, Notes = ba.Notes, Description = ba.Description, Balance = (decimal)glB.ClosingBalance }).ToListAsync();
注意事项
- 务必将代码中的
DateField替换为GLBalances表中存储日期的实际字段名称(比如BalanceDate)。 - 若使用EF Core,确保分组排序的写法能被正确转换为SQL,避免内存中处理大量数据。
内容的提问来源于stack exchange,提问作者user1319463
相关产品推荐
相关产品推荐

