使用此代码:
var dbrepayments = _context.Repayments.Include("Loan").Include("Loan.Borrower").Include("Loan.LoanProduct")
.Where(c => c.PaidOn == null && c.DateOfRepayment <= today)
.GroupBy(c => c.Loan.Id, (key, g) => g.OrderByDescending(c => c.Id).FirstOrDefault())
.OrderBy(c => c.DateOfRepayment);
[_context
是我使用代码优先方法从数据库中获取结果的ApplicationDbContext
类型。
问题是,当我尝试遍历dbrepayments
并获取Loan
,Loan.Borrower
和Loan.LoanProduct
对象的值时,它们显示为null
。但是,当我删除GroupBy
时,这些对象将正确返回。
我敢打赌,这里的问题是您的GroupBy
语句中的元素选择器:
(key, g) => g.OrderByDescending(c => c.Id).FirstOrDefault()
当我第一次阅读它时,这没有多大意义。您要按贷款分组还款,然后尝试仅选择每笔贷款的最后一次还款?然后按日期订购这些第一笔还款。
我相信这将为您提供与渴望的加载关系相关的结果:
var dbrepayments = _context.Repayments.Include("Loan").Include("Loan.Borrower").Include("Loan.LoanProduct")
.Where(c => c.PaidOn == null && c.DateOfRepayment <= today)
.GroupBy(c => c.Loan.Id)
.Select(c => c.OrderByDescending(x => x.Id).FirstOrDefault())
.OrderBy(c => c.DateOfRepayment);
GroupBy
将尊重Include
,但是如果您使用选择表达式,它将覆盖它。您无法在选择器内添加Include
,因为它正在处理IEnumerable预期结果。相反,将结果按预期分组,然后按结果分组Select
以获取最新的还款额。这将为您提供最新还款清单,然后您可以订购。