web-dev-qa-db-fra.com

Comment inclure () une entité enfant imbriquée dans linq

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.

27
Evonet

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.

37
Mattias Åslund

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 =

18
flindeberg

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();
8

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();

(source)

2
Menasheh