【问题标题】:Field expression GroupBy not returning included objects字段表达式 GroupBy 不返回包含的对象
【发布时间】:2019-12-18 16:41:01
【问题描述】:

在这段代码中:

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

_contextApplicationDbContext 类型,我用于使用 Code-First 方法从数据库中获取结果。

问题是当我尝试遍历dbrepayments 并获取LoanLoan.BorrowerLoan.LoanProduct 的值时,它们显示为null。但是当我删除GroupBy 时,这些对象会正确返回。

【问题讨论】:

  • 您能否展示迭代代码以及您如何尝试获取Loan
  • 听起来GroupBy 正在本地评估,因此将数据库结果投影到新类型,这意味着您丢失了包含的类型。检查控制台输出是否有任何 LINQ 翻译警告。
  • @Matt 不是任何复杂的代码。即使我喜欢这个var x = dbrepayments.FirstOrDefault().Loan,它也会返回null
  • @KieranDevlin 我在输出窗口中没有看到任何警告。

标签: c# .net asp.net-mvc entity-framework code-first


【解决方案1】:

我敢打赌这里的问题是您的 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 以获取最新还款。这将为您提供您可以订购的最新还款清单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多