如何在linq中包含()嵌套的子实体

时间:2014-06-09 12:11:01

标签: c# .net linq entity-framework

如何包括孩子的孩子?

即,乔布斯有引用具有QuoteItems

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

为了更清楚 - 我试图检索单个作业项目,并且它关联的报价(一对多)和每个报价相关的QuoteItems(一个报价可以有多个QuoteItems)< / p>

我之所以问的原因是因为在我的报价索引视图中,我试图通过提取小计来显示每个报价的所有报价项目的总和,但它出现了我正在调用这样的小计:

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

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

4 个答案:

答案 0 :(得分:33)

要获得一份工作并急切加载其所有引号及其引用项,请写下:

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;

答案 1 :(得分:14)

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

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语句的详细信息,请查看:http://msdn.microsoft.com/en-us/library/bb738708(v=vs.110).aspx

答案 2 :(得分:6)

这对我来说就像@flindeberg在这里所说的那样。 刚添加检查列表中每个父项是否有子项

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

答案 3 :(得分:2)

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)