2009-09-13 133 views
0

的關係,我在學校的I類有這樣的代碼:訪問的關係與實體框架

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

Student類有兩種關係:老師和學校。在學校課堂上,我試圖找出所有教師有特定身份證的學生。

的問題是,我在聲明中

student.Teacher.Id 

我想這樣做this.Students.Include( 「老師」)的獲得

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

,但this.Students沒有這樣的方法。任何想法如何執行該查詢?

回答

0

Include子句可以在linq中用於實體查詢。例如:

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

我想這是this.Students集被拉入內存了,所以你可能會考慮在這部分代碼,你是從星展銀行取回的學生。如果你想稍後加載學生教師(非常重要的是學生實體被ObjectContext跟蹤!),你可以在TeacherReference屬性上使用Load方法,但是對於此中的每個學生。學生單獨收集:

student.TeacherReference.Load(); 

希望這有助於

+0

如果對Teacher.Id的唯一引用是LINQ to Entities查詢的where子句,則不需要包含。只有在迭代結果時檢查教師*時才需要包含。 – 2009-09-14 13:59:46

+0

是的,包含不能用於對象的關係。我不再有權訪問數據庫,因爲我在學校課堂內。我可以加載一個引用就好了,但是遍歷引用的所有元素來引導他們的引用中的一個聽起來不太好,這將是相當浪費。 – Pablo 2009-09-14 14:21:27

0

你給這行代碼:

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

首先,=應該是==

是這樣只是一個錯字?

其次,你不需要包括以下,改正後的查詢,如果取消引用老師不要以後:

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

LINQ到實體不需要Inlcude只是在where條款。

需要包括如果以後迭代的結果並取消引用老師:

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

第三,告訴你這個錯誤:

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

這不是一個LINQ to實體錯誤。該錯誤實際上是在那行代碼中,還是在其他地方?

另外,什麼是this?如果它不是ObjectContext,那麼你很可能是LINQ to Objects,而不是LINQ to Entities。在這種情況下,你不會有可用的包含。如果是這種情況,那麼this.Sbudents從哪裏來?

+0

正如我所說,我在學校裏有這樣的代碼,所以這是* a *學校。目前沒有可用的上下文,因此您可能會說它是LINQ to Objects。 – Pablo 2009-09-14 14:22:49

+0

好的,如果你在LINQ中的對象,那麼你必須加載(雖然這確實需要學校附加到一個活的上下文)或添加到任何人口稠密的學校原來。 – 2009-09-14 14:24:18

0

我已經找到了調試器讓我走THROU查詢的每次迭代:

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

所以我得看student.Teacher.Id == ID多次。每次我調試它都沒有發生,一切正常。我轉身表達爲:

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

,它不僅停止崩潰,但它工作得很好,以及(在選擇時預期所有的學生)。我不完全確定爲什麼。

+0

我可以猜出爲什麼!因爲有時一個學生可能有一個老師,有時候不是。對學生強制教學嗎?! 如果您聲稱有時會返回結果,那麼這意味着它是真實的,有時候學生沒有老師。 – 2009-09-14 23:36:05

+0

mosessaur,好主意;不幸的是,教師是一個不可空的字段。但正如其他人所說,這不再是LINQ到實體,而是LINQ到對象,也許你是對的。另外,如果由於某種原因,有些學生沒有老師,當我改變所有學生的學校時,應該留下這些學生,而他們不是。非常令人費解。 – Pablo 2009-09-15 05:46:08

+0

小心點。這可能巧合地「起作用」。這可能是因爲老師爲空的學生不會碰巧在您要加載的課程中。但你不能指望這一點。您需要解決爲什麼教師不會首先加載的問題,這可以追溯到您的LINQ to Entities查詢。 – 2009-09-15 13:57:22