【问题标题】:How to include() nested child entity in linq如何在 linq 中包含()嵌套子实体
【发布时间】:2014-06-09 12:11:00
【问题描述】:

如何包含子实体的子代?

即,乔布斯有报价,其中有报价项目

var job = db.Jobs
            .Where(x => x.JobID == id)
            .Include(x => x.Quotes)
            .Include(x => x.Quotes.QuoteItems) // This doesn't work
            .SingleOrDefault();

为了更清楚 - 我正在尝试检索单个 Job 项目,它与 Quotes 相关联(一对多),并且对于每个 Quote 关联的 QuoteItems (一个 Quote 可以有许多 QuoteItems)

我问的原因是因为在我的报价索引视图中,我试图通过汇总小计来显示每个报价的所有报价项目的总计,但它显示为 0。我正在调用小计像这样:

@item.QuoteItem.Sum(p => p.Subtotal)

我相信我遇到这个问题的原因是我上面的 Linq 查询没有为每个 Quote 检索关联的 QuoteItems。

【问题讨论】:

标签: c# .net linq entity-framework


【解决方案1】:

要找到一份工作并急切地加载其所有报价及其报价项,请编写:

var job = db.Jobs
        .Include(x => x.Quotes.Select(q => q.QuoteItems))
        .Where(x => x.JobID == id)
        .SingleOrDefault();

如果 QuoteItems 也是一个集合,您可能需要 SelectMany 而不是 Select

给别人的注意事项;强类型Include() 方法是一种扩展方法,因此您需要在文件顶部包含using System.Data.Entity;

【讨论】:

    【解决方案2】:

    这将完成这项工作(假设我们正在谈论实体框架并且您想要获取子实体):

    var job = db.Jobs
                .Include(x => x.Quotes) // include the "Job.Quotes" relation and data
                .Include("Quotes.QuoteItems") // include the "Job.Quotes.QuoteItems" relation with data
                .Where(x => x.JobID == id) // going on the original Job.JobID
                .SingleOrDefault(); // fetches the first hit from db.
    

    有关Include 声明的更多信息,请查看:https://docs.microsoft.com/en-us/dotnet/api/system.data.objects.objectquery-1.include

    多年来,这个答案一直受到支持,所以我想澄清一下,先试试https://stackoverflow.com/a/24120209/691294。此答案适用于所有其他方法都失败并且您必须求助于黑魔法解决方案(即使用魔术字符串)的情况。

    【讨论】:

    • 你试过在where子句之后使用.Include吗?
    • 这是一个相当奇怪的答案。
    • @DanielKelley 嗯?对象查询?可悲的是,这就是你做事的方式。
    • @RamyMohamed Ty 指出,Include 仅对对象查询有效。
    • 我认为这很好,但是 iirc,你不需要第一个 .include 行,因为它将作为第二个包含行的一部分包含在内,所以你只需要反射调用,而不是第一个引号调用。
    【解决方案3】:

    accepted answer 中的方法在 .NET Core 中不起作用。

    对于使用 .NET Core 的任何人,虽然 magic string 方式确实有效,但更简洁的方式是 ThenInclude

    var job = db.Jobs
            .Where(x => x.JobID == id)
            .Include(x => x.Quotes)
            .ThenInclude(x => x.QuoteItems)
            .SingleOrDefault();
    

    (source)

    【讨论】:

    • 这对我来说是正确的答案。我有孩子的孩子,看起来你可以用这个嵌套很深,“魔术字符串”不起作用。
    • 我同意,这很好用而且有点干净。
    【解决方案4】:

    正如@flindeberg 所说,这对我有用。 刚刚添加了检查列表中每个父项中是否有子项

     List<WCF.DAL.Company> companies = dbCtx.Companies.Where(x=>x.CompanyBranches.Count > 0)
                                .Include(c => c.CompanyBranches)
                                .Include("CompanyBranches.Address")
                                .ToList();
    

    【讨论】:

    • 不使用魔术字符串会更好:.Include(${nameof(Companies.CompanyBranches)}.{nameof(CompanyBranch.Address)})
    猜你喜欢
    • 2017-08-31
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    相关资源
    最近更新 更多