2010-07-06 5 views
8

J'ai cette structure de table très basique:LINQ to Entities - chargement désireux utilisant Include()

dbo.tblCategory
dbo.tblQuestion (plusieurs à un rapport à tblCategory)
dbo.tblAnswer (beaucoup à une relation à tblQuestion)

Donc, fondamentalement, ce que j'essaye de faire est quand je charge une catégorie, je veux également charger toutes les questions, et toutes les réponses.

Maintenant, je suis en mesure de le faire en utilisant le code suivant:

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

Cependant, je ne suis pas complètement tombé amoureux de cette; si les noms de relations changent dans mon modèle; Je ne vais pas avoir d'erreur lors de la construction du projet. Idéalement, j'aimerais utiliser une expression lambda; quelque chose comme ceci:

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

Maintenant, avec l'extrait ci-dessus; Je suis coincé sur la façon d'explorer la table Answers. Une idée sur ce que je pourrais utiliser pour une expression lambda pour celui-ci?

+0

Linq to Entities dans .NET 4.0 prend en charge le chargement paresseux (activé par défaut) autant que je sache. Tu n'avais pas besoin de t'inquiéter de ça alors. =) – Jens

+0

En supposant que nous sommes sur 4.0. Nous utilisons toujours 3.5 pour le moment =) –

+0

duplication possible de [Entity Framework .Include() avec la vérification de temps de compilation?] (Http://stackoverflow.com/questions/2921119/entity-framework-include-with- compile-time-checking) –

Répondre

7

OK; J'ai réussi à faire fonctionner ceci, avec de l'aide de here.

Fondamentalement, je dois faire ceci:

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

À partir du lien ci-dessus, je ne peux déréférencer tblAnswers sur des éléments individuels de la collection de questions. Ici, j'ai choisi de déréférencer tblAnswers sur le premier élément de la collection. En réalité, cette expression lambda est simplement utilisée pour produire le chemin de propriété "tblQuestion.tblAnswers", qui chargera avec impatience les réponses de toutes les questions.

Donc, même si je ne tire que les réponses à la première question, je tire toutes les réponses à toutes les questions.

+6

Si vous ne pouvez pas utiliser 'Include()' avec des expressions lambda, ajoutez 'using System.Data.Entity;'. ([src] (http://stackoverflow.com/a/21005478/1937994)) – gronostaj

+0

Ou: 'using Microsoft.Data.Entity;' –