2014-06-09 10 views
7

Jak dołączyć dziecko do dziecka?Jak dołączyć() zagnieżdżoną jednostkę podrzędną do linq

Ie, Praca mieć notowania, które mają QuoteItems

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

Wystarczy być jaśniejsze - Próbuję pobrać pojedynczy element Job, a to wiąże się wykresy (jeden do wielu) i dla każdego zacytować związane QuoteItems (jedna wycena może mieć wiele cytatów)

Powód, o który pytam jest taki, że w widoku indeksu wyceny staram się pokazać sumę wszystkich pozycji wycen dla każdego wycenu przez SUMMOWANIE sumy częściowej, ale nadchodzi jako 0. Dzwonię do podsumy w następujący sposób:

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

Wierzę, że powodem, dla którego mam ten problem, jest to, że moje zapytanie Linq powyżej nie pobiera powiązanych QuoteItems dla każdego cytatu.

+0

prawdopodobnie dostał kompilatora lub błąd składni prawo? –

+0

Tak, jestem prawie pewien, że to nie jest składnia, chciałem tylko zademonstrować, co było po – Evonet

+0

Czy przegapiłeś tag 'entityframework' btw? – flindeberg

Odpowiedz

17

Aby dostać pracę i chętny obciążenie wszystkich jego cytaty i ich quoteitems, piszesz:

var job = db.Jobs 
     .Include(x => x.Quotes.Select(q => q.QuoteItems)) 
     .Where(x => x.JobID == id) 
     .SingleOrDefault(); 

Być może trzeba SelectMany zamiast wyboru, jeśli QuoteItems jest również zbiorem.

Uwaga dla innych; Mocno wpisana metoda Include() jest metodą rozszerzenia, więc musisz umieścić na górze pliku using System.Data.Entity;.

+0

To się udało, dziękuję – Evonet

6

Będzie to wykonać zadanie (biorąc pod uwagę, że mówimy Entity Framework i chcesz pobrać Rodziny podmioty):

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. 

Aby uzyskać więcej informacji na temat rachunku Include rzucić okiem na to: http://msdn.microsoft.com/en-us/library/bb738708(v=vs.110).aspx

+0

Czy próbowałeś użyć .Include po klauzuli where? –

+0

To dość dziwna odpowiedź. –

+0

@DanielKelley Eh? ObjectQuery? To sposób, w jaki robisz to ze smutkiem. – flindeberg

2

Zrobiłem to dla mnie, jak powiedział @ Flindeberg. prostu dodał sprawdzenie, czy są dzieci w każdej pozycji dominującej na liście

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