2009-09-13 134 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