2009-09-13 3 views
0

I класс школы у меня есть этот код:Доступ к взаимосвязи отношений с Entity Framework

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

Класс Student Есть два отношения: учитель и школа. В классе школы я пытаюсь узнать всех учеников, у которых у Учителя есть определенный идентификатор.

Проблема заключается в том, что я получаю

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

в заявлении

student.Teacher.Id 

Я думал делать this.Students.Include ("Учитель"), но 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 это коллекция втягивается в память уже, так что вы могли бы рассмотреть этот код в части, которую вы запрашиваете студент из DBS. Если вы хотите позже загрузить Учителя Студента (очень важно, чтобы объекты-ученики отслеживались ObjectContext!), Вы можете использовать метод Load в свойстве TeacherReference, но для каждого учащегося в этой коллекции. Студенты отдельно:

student.TeacherReference.Load(); 

Надеюсь, что это помогает

+0

Include не требуется, если единственной ссылкой на Teacher.Id является предложение where запроса LINQ to Entities. Включить нужно только, если вы изучите Учителя. * При повторении результатов. –

+0

Да, Include не может использоваться в отношении объекта. У меня больше нет доступа к db, так как я нахожусь в классе школы. Я могу загрузить ссылку просто отлично, но повторение по всем элементам ссылки, чтобы привести одну из их ссылок, звучит не очень хорошо, и это будет довольно расточительно. – Pablo

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 для всего ГДЕ пункт.

Вы бы нужно включать, если вы позже итерация результаты и разыменовываются Учитель:

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

В-третьих, показать эту ошибку:

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

Это не является LINQ к Entities ошибок. Действительно ли ошибка на этой строке кода, или это где-то в другом месте?

Также, что такое this? Если это не ObjectContext, то вы находитесь в вероятном LINQ для объектов, а не LINQ to Entities. В этом случае у вас не будет Include available. Если это так, то откуда взялось this.Sbudents?

+0

Как я уже сказал, у меня есть этот код внутри школы, так что это * * школа. В настоящий момент контекст недоступен, поэтому вы, вероятно, правы, говоря, что это LINQ to Objects. – Pablo

+0

OK, если вы находитесь в LINQ для объектов, тогда вы должны либо загрузить (хотя для этого требуется, чтобы школа была привязана к контексту в реальном времени), либо добавьте Include в любую заполненную школу изначально. –

0

Я нашел отладчик позвольте мне идти throu каждой итерации запроса:

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

так что я должен видеть student.Teacher.Id == идентификаторов много раз. Каждый раз, когда я отлаживался, этого не происходило, и все работало нормально. Я повернул выражение в:

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

и это не только остановили сбой, но он работал отлично, а также (все студенты, где выбранные как ожидалось). Я не совсем уверен, почему.

+0

Я могу догадаться, почему! потому что иногда у Студента может быть учитель, а иногда нет. Обучает ли обязательное для ученика? И если вы утверждаете, что он иногда возвращает результаты, значит, это правда, иногда у ученика нет учителя. –

+0

mosessaur, хорошая идея; К сожалению, Учитель - это поле, не подлежащее обнулению. Но поскольку, как говорили другие, это больше не LINQ-to-Entities, а LINQ-to-Objects, может быть, вы правы. Также, если по какой-то причине были некоторые ученики с нулевым учителем, когда я менял школу всех этих учеников, их следует оставить позади, а это не так. Очень озадачивает. – Pablo

+0

Будьте осторожны. Это может «работать» по совпадению. Это может быть так, что ученики, у которых учитель равен нулю, не попадают в класс, который вы пытаетесь загрузить. Но вы не можете рассчитывать на это. Вам нужно решить проблему, почему учителя не загружаются в первую очередь, что возвращается к вашему запросу LINQ to Entities. –

Смежные вопросы