Comment puis-je inclure un enfant d'un enfant en droit?
C'est-à-dire, les travaux ont des devis qui ont QuoteItems
var job = db.Jobs
.Where(x => x.JobID == id)
.Include(x => x.Quotes)
.Include(x => x.Quotes.QuoteItems) // This doesn't work
.SingleOrDefault();
Juste pour être plus clair - j'essaie de récupérer un seul élément de travail, et ses devis associés (un à plusieurs) et pour chaque devis les QuoteItems associés (un devis peut avoir plusieurs QuoteItems)
La raison pour laquelle je pose la question est que dans ma vue Index des devis, j'essaie d'afficher le total de tous les éléments de devis pour chaque devis en sommant le sous-total, mais il apparaît sous la forme 0. J'appelle le sous-total comme ceci:
@item.QuoteItem.Sum(p => p.Subtotal)
Je crois que la raison pour laquelle j'ai ce problème est que ma requête Linq ci-dessus ne récupère pas les QuoteItems associés pour chaque devis.
Pour obtenir un emploi et charger avec impatience tous ses devis et leurs devis, vous écrivez:
var job = db.Jobs
.Include(x => x.Quotes.Select(q => q.QuoteItems))
.Where(x => x.JobID == id)
.SingleOrDefault();
Vous pourriez avoir besoin de SelectMany
au lieu de Select
si QuoteItems est également une collection.
Note aux autres; La méthode Include()
fortement typée est une méthode d'extension, vous devez donc inclure using System.Data.Entity;
En haut de votre fichier.
Cela fera le travail (étant donné que nous parlons de structure d'entité et que vous souhaitez récupérer des entités enfants):
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.
Pour plus d'informations sur l'instruction Include
, consultez ceci: http://msdn.Microsoft.com/en-us/library/bb738708 (v = vs.110) .aspx =
Cela a fait l'affaire pour moi, comme l'a dit @flindeberg ici. Ajout de la vérification de la présence d'enfants dans chaque élément parent de la liste
List<WCF.DAL.Company> companies = dbCtx.Companies.Where(x=>x.CompanyBranches.Count > 0)
.Include(c => c.CompanyBranches)
.Include("CompanyBranches.Address")
.ToList();
La méthode dans réponse acceptée ne fonctionne pas dans .NET Core.
Pour toute personne utilisant .NET Core, alors que la méthode chaîne magique fonctionne, la façon la plus propre de le faire serait ThenInclude
:
var job = db.Jobs
.Where(x => x.JobID == id)
.Include(x => x.Quotes)
.ThenInclude(x => x.QuoteItems)
.SingleOrDefault();