2009-09-13 6 views
0

la classe I de l'école, j'ai ce code:Accès à la relation d'une relation avec Entity Framework

from student in this.Students where student.Teacher.Id == id select student 

La classe des étudiants il y a deux relations: Enseignant et l'école. Dans la classe d'école j'essaye de trouver tous les étudiants dont le professeur a un id donné.

Le problème est que je reçois

System.NullReferenceException: Object reference not set to an instance of an object.

dans la déclaration

student.Teacher.Id 

Je pensais à faire this.Students.Include ("Maître"), mais this.Students n'a pas de une telle méthode. Des idées comment puis-je effectuer cette requête?

Répondre

0

La clause Include peut être utilisée dans la requête linq to entities. Par exemple:

using (YourDataContext db = new YourDataContext()) 
     { 
      var query = from s in db.Students.Include("Teacher") 
         where s.Teacher.ID == 1 
         select s; 
      //etc... 
     } 

Je suppose que this.Students est tiré collection en mémoire déjà, vous pourriez envisager ce code dans la partie que vous récupérez des étudiants de dbs. Si vous voulez charger plus tard Teacher of the Student (très important est que les entités étudiantes sont suivies par ObjectContext!), Vous pouvez utiliser la méthode Load sur la propriété TeacherReference, mais pour chaque étudiant de cette collection .Students séparément:

Hope this helps

+0

L'inclusion n'est pas nécessaire si la seule référence à Teacher.Id est la clause where d'une requête LINQ to Entities. Inclure n'est nécessaire que si vous examinez le professeur. * Lors de l'itération des résultats. –

+0

Oui, Inclure ne peut pas être utilisé dans une relation d'un objet. Je n'ai plus accès au db, car je suis dans la classe scolaire. Je peux très bien charger une référence, mais iterer sur tous les éléments d'une référence pour diriger une de leurs références ne va pas très bien et ça va être un gaspillage. – Pablo

0

vous montrer cette ligne de code:

from student in this.Students where student.Teacher.Id = id select student 

en premier lieu, les = doivent être ==

est-ce juste une faute de frappe?

Deuxièmement, vous ne pas besoin d'inclure pour les éléments suivants, la requête corrigée, si vous ne le faites pas déréférencer Maître plus tard:

var q = from student in SomeObjectContext.Students 
     where student.Teacher.Id == id 
     select student; 

LINQ to Entities ne nécessite pas inlcude pour seulement où clause.

Vous auriez besoin d'inclure si vous Iterated plus tard, les résultats et déréférencé Enseignant:

foreach (var student in q) 
{ 
    Console.WriteLn(student.Teacher.Id); 
} 

Troisièmement, vous montrez cette erreur:

System.NullReferenceException: Object reference not set to an instance of an object.

Ce n'est pas LINQ à l'erreur entités. L'erreur est-elle réellement sur cette ligne de code, ou est-ce ailleurs?

De plus, qu'est-ce que this? Si ce n'est pas un ObjectContext, alors vous êtes probablement dans LINQ to Objects, pas LINQ to Entities. Dans ce cas, vous n'auriez pas d'inclure disponible. Si c'est le cas, d'où vient this.Sbudents?

+0

Comme je l'ai dit, j'ai ce code à l'intérieur de l'école, donc c'est * une * école. Aucun contexte n'est disponible en ce moment, donc vous avez probablement raison de dire que c'est LINQ to Objects. – Pablo

+0

OK, si vous êtes dans des objets LINQ, vous devez soit charger (bien que cela nécessite que l'école soit rattachée à un contexte en direct), soit ajouter l'élément Inclure dans une école peuplée à l'origine. –

0

J'ai trouvé le débogueur m'a laissé marcher THROU chaque itération de la requête:

from student in this.Students where student.Teacher.Id == id select student 

donc je dois voir student.Teacher.Id == id plusieurs fois. Chaque fois que je déboguais ça n'arrivait pas et tout fonctionnait très bien. Je me suis tourné l'expression en:

from student in this.Students where student.Teacher != null && student.Teacher.Id == id select student 

et non seulement arrêté de s'écraser, mais il a bien fonctionné aussi bien (tous les étudiants sélectionnés où comme prévu). Je ne suis pas totalement sûr pourquoi.

+0

Je peux deviner pourquoi! parce que parfois un étudiant peut avoir un enseignant parfois non. Un enseignement est-il obligatoire pour un étudiant ?! Et si vous prétendez que cela renvoie parfois des résultats, alors cela signifie que c'est vrai, parfois un étudiant n'a pas d'enseignant. –

+0

mosessaur, bonne idée; Malheureusement, l'enseignant est un champ non nullable. Mais comme d'autres l'ont dit, ce n'est plus LINQ-to-Entities, mais LINQ-to-Objects, peut-être avez-vous raison. Aussi, si pour une raison ou pour une autre, il y avait des étudiants avec un enseignant nul, quand j'ai changé l'école de tous ces étudiants, ceux-ci devraient être laissés pour compte, et ils ne le sont pas. Très curieux. – Pablo

+0

Faites attention. Cela peut "fonctionner" par coïncidence. Il se peut que les élèves dont le professeur est nul ne se trouvent pas dans la classe que vous essayez de charger. Mais vous ne pouvez pas compter là-dessus. Vous devez résoudre le problème de non-chargement des enseignants en premier lieu, ce qui revient à votre requête LINQ to Entities. –

Questions connexes