我在学校课上我有这段代码:
from student in this.Students where student.Teacher.Id == id select student
学生班有两种关系:教师和学校。在学校课堂上,我试图找出所有教师都有特定身份的学生。
问题是我得到了
System.NullReferenceException:未将对象引用设置为对象的实例。
在声明中
student.Teacher.Id
我想过这样做.Students.Include(“老师”),但是这个。学生没有这样的方法。任何想法如何执行该查询?
答案 0 :(得分: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...
}
我想这就是这个。学生已经把收藏品拉进了记忆库,所以你可能会在你从dbs中检索学生的部分考虑这个代码。如果您想稍后加载学生的教师(非常重要的是ObjectContext跟踪学生实体!),您可以在TeacherReference属性上使用Load方法,但是对于this.Students集合中的每个学生分别使用:
student.TeacherReference.Load();
希望这有帮助
答案 1 :(得分: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 to Entities不需要Inlcude仅用于where子句。
如果您稍后迭代结果并取消引用教师, 需要包含:
foreach (var student in q)
{
Console.WriteLn(student.Teacher.Id);
}
第三,您显示此错误:
System.NullReferenceException:未将对象引用设置为对象的实例。
这不是LINQ to Entities错误。错误实际上是在该行代码上,还是在其他地方?
此外, this
是什么?如果它不是ObjectContext,那么你很可能是LINQ to Objects,而不是LINQ to Entities。在这种情况下,您不会包含Include。如果是这种情况,那么this.Sbudents
来自哪里?
答案 2 :(得分:0)
我发现调试器让我走遍查询的每次迭代:
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
并且它不仅停止了崩溃,而且它也运行良好(所有学生都按预期选择)。我不完全确定原因。