2013-11-13 3 views
1

Сегодня я столкнулся с странным исключением. У меня две таблицы в моей БД, у которых есть некоторые связанные столбцы. Согласно логике моего приложения, я должен сделать обновление для выбора и отправить обновленный список в мое представление. Итак, я поступаю так:Исключение Nullreference, когда модель не равна нулю

return View(repo.Enrollee.ToList().Select(p => { 
       p.SpecialtyCode = repo.EnrolleePlaces.FirstOrDefault(t => 
       t.SpecialtyCode == p.SpecialtyCode).Specialty; 
       return p; 
       }).OrderByDescending(p => p.Update)); 

Когда я делаю foreach на Model все в порядке, но когда я пытаюсь сосчитать элементы модели, используя @Model.Count(), я получаю Nullreference. Я получаю Nullreference, даже когда копирую foreach прямо под первым. Любые идеи, что это может быть?

+0

Один из ваших объектов явно 'null'. Вы уже прошли через свой отладчик? – Brian

+3

Вы будете бороться с отладкой этого, когда все это одна строка кода. Разбейте его. –

+1

может быть старый код где-то кэширован. попробуйте Build> Clean Solution and Build> REBUILD. что происходит сейчас? И как предложил @MichaelPerrenoud - разбить код на более мелкие управляемые куски и упростить чтение. –

ответ

3

Даже если вы уверены, что ваши переменные не равно нулю:

Если вы используете FirstOrDefault, возвращаемое значение может быть пустым, и поэтому вы должны проверить его перед обращением .Specialty:

p.SpecialtyCode = repo.EnrolleePlaces.FirstOrDefault(t => 
t.SpecialtyCode == p.SpecialtyCode).Specialty; 

Вы можете использовать следующие:

var someVar = repo.EnrolleePlaces.FirstOrDefault(t => t.SpecialtyCode == p.SpecialtyCode); 
p.SpecialtyCode = someVar == null? null : someVar.Specialty; 
+0

Мб вы правы, я проверю. Но одна вещь меня смутила: когда я делаю точку останова, на мой взгляд, модель полностью правильная – Dunadan

+1

Ваши точки останова не входят в выражение лямбда –

+0

это правда. Выражения (как я недавно обнаружил) - это боль, и вы не можете сломать возврат и шаг в выражение ... Я должен был написать свой собственный «ExpressionVisitor» пару недель назад, а святой sh * t , –

0

Благодаря @AlbinSunnanbo и его ап swer here. У меня есть то, что мне нужно. Просто выполнил мой запрос по телефону другой ToList() ...

Итак, вот ответ:

return View(repo.Enrollee.ToList().Select(p => { 
       p.SpecialtyCode = repo.EnrolleePlaces.FirstOrDefault(t => 
       t.SpecialtyCode == p.SpecialtyCode).Specialty; 
       return p; 
       }).OrderByDescending(p => p.Update).ToList()); 
Смежные вопросы