2010-07-06 2 views
8

Ho questa struttura della tabella veramente di base:LINQ to Entities - eager loading usando Include()

dbo.tblCategory
dbo.tblQuestion (molti a uno rapporto con tblCategory)
dbo.tblAnswer (rapporto molti a uno con tblQuestion)

Quindi, in pratica, quello che sto cercando di fare è quando carico una categoria, voglio anche caricare tutte le domande e tutte le risposte.

Ora, io sono stato in grado di farlo utilizzando il seguente codice:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include("tblQuestion") 
              .Include("tblQuestion.tblAnswers")  
       where t.Id == id 
       select t).FirstOrDefault(); 

      return entities.DetachObjectGraph(dto); 
     } 
    } 
} 

Tuttavia, io non sono completamente innamorato con questo; se i nomi delle relazioni cambiano nel mio modello; Non ho intenzione di ottenere un errore durante la costruzione del progetto. Idealmente, mi piacerebbe usare un'espressione lambda; qualcosa del genere:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include(t => t.tblQuestion) 
      where t.Id == id 
      select t).FirstOrDefault(); 

     return entities.DetachObjectGraph(dto); 
    } 
} 

Ora, con il frammento di cui sopra; Sono bloccato su come eseguire il drill down nella tabella delle risposte. Qualche idea su cosa potrei usare per un'espressione lambda per questo?

+0

Linq to Entities in .NET 4.0 supporta il caricamento lazy (abilitato per impostazione predefinita) per quanto ne so. Non dovevi preoccuparti di questo allora. =) – Jens

+0

Supponendo che siamo su 4.0. Stiamo ancora utilizzando 3.5 per il momento =) –

+0

possibile duplicato di [Entity Framework .Include() con il controllo del tempo di compilazione?] (Http://stackoverflow.com/questions/2921119/entity-framework-include-with- compila-time-checking) –

risposta

7

OK; Sono stato in grado di farlo funzionare, con un po 'di aiuto da here.

Fondamentalmente, ho bisogno di fare questo:

public tblCategory Retrieve(int id) 
{ 
    using (var entities = Context) 
    { 
     var dto = 
      (from t in entities.tblCategory.Include(t => t.tblQuestion) 
              .Include(t => t.tblQuestion.First().tblAnswer) 
      where t.Id == id 
      select t).FirstOrDefault(); 

     return entities.DetachObjectGraph(dto); 
    } 
} 

dal link qui sopra, posso solo dereferenziare tblAnswers sulle singole voci della collezione domande. Qui ho scelto di dereferenziare tblAnswers sul primo elemento della raccolta. In realtà, questa espressione lambda viene semplicemente utilizzata per produrre il percorso della proprietà "tblQuestion.tblAnswers", che caricherà tutte le risposte di tutte le domande.

Quindi, anche se sembra che sto solo tirando le risposte per la prima domanda, in realtà sto tirando tutte le risposte per tutte le domande.

+6

Se non puoi usare 'Include()' con espressioni lambda, aggiungi 'using System.Data.Entity;'. ([src] (http://stackoverflow.com/a/21005478/1937994)) – gronostaj

+0

Oppure: 'utilizzando Microsoft.Data.Entity;' –