如何包括孩子的孩子?
即,乔布斯有引用具有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。
答案 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();