Evo*_*net 32 .net c# 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();
Run Code Online (Sandbox Code Playgroud)
为了更清楚 - 我正在尝试检索单个作业项目,并且它是关联的报价(一对多)和每个报价相关的QuoteItems(一个报价可以有许多QuoteItems)
我问的原因是因为在我的报价索引视图中,我试图通过SUMming小计显示每个报价的所有报价项目的总和,但是它出现为0.我正在调用这样的小计:
@item.QuoteItem.Sum(p => p.Subtotal)
Run Code Online (Sandbox Code Playgroud)
我相信我遇到这个问题的原因是我上面的Linq查询没有检索每个Quote的相关QuoteItems.
Mat*_*und 43
为了得到一份工作并热切地加载所有引号和引用项,你写道:
var job = db.Jobs
.Include(x => x.Quotes.Select(q => q.QuoteItems))
.Where(x => x.JobID == id)
.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
您可能需要SelectMany
而不是Select
QuoteItems也是一个集合.
别人注意; 强类型Include()
方法是一种扩展方法,因此您需要包含using System.Data.Entity;
在文件的顶部.
fli*_*erg 21
这将完成工作(假设我们正在讨论实体框架,并且您想要获取子实体):
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.
Run Code Online (Sandbox Code Playgroud)
有关该Include
声明的更多信息,请查看:http://msdn.microsoft.com/en-us/library/bb738708(v = vs.110).aspx
@flindeberg在这里说,这对我来说很有用.刚添加检查列表中每个父项是否有子项
List<WCF.DAL.Company> companies = dbCtx.Companies.Where(x=>x.CompanyBranches.Count > 0)
.Include(c => c.CompanyBranches)
.Include("CompanyBranches.Address")
.ToList();
Run Code Online (Sandbox Code Playgroud)
接受的答案中的方法在.NET Core中不起作用。
对于使用.NET Core的任何人,虽然魔术字符串方法确实有效,但更干净的方法是ThenInclude
:
var job = db.Jobs
.Where(x => x.JobID == id)
.Include(x => x.Quotes)
.ThenInclude(x => x.QuoteItems)
.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)