2010-01-05 3 views
0

Я использую следующий код для извлечения данных из моей базы данных с помощью сущностей. Если запись не найдена, она выдает следующее исключение: «Ссылка на объект не установлена ​​в экземпляр объекта». Я могу поймать это, чтобы остановить его, вызвав проблемы, но скорее изменит код, чтобы не возникнуть проблема. Могу ли я изменить запрос Linq, чтобы он был более терпимым?Linq выдает исключение, когда ничего не возвращает

  using (var ctx = new MyEntities()) 
      { 
       var users = ctx.NotificationMessages.Include("NotificationUsers") 
           .Where(x => x.Priority == priority) 
           .FirstOrDefault().NotificationUsers 
           .ToList(); 
      } 

ответ

6

Проблема заключается в том, что FirstOrDefault может возвращать нуль, и вы должны проверить, что:

var notificationMessage = ctx.NotificationMessages.Include("NotificationUsers") 
          .Where(x => x.Priority == priority) 
          .FirstOrDefault(); 

if (notificationMessage != null) { 
    var users = notificationMessage.NotificationUsers.ToList(); 
    // ... 
} 
0
.FirstOrDefault().NotificationUsers 

Ну что можно ожидать. У вас нет нулевой отметки!

0

FirstOrDefault возвращает nul life, нет результатов. Вы можете написать

var message = ctx.NotificationMessages.Include("NotificationUsers") 
          .Where(x => x.Priority == priority) 
          .FirstOrDefault(); 
var users = message == null ? new List<User>() : message.NotificationUsers.ToList(); 

или вы могли бы написать

var users = (ctx.NotificationMessages.Include("NotificationUsers") 
          .Where(x => x.Priority == priority) 
          .FirstOrDefault() ?? new NotificationMessage()).NotificationUsers.ToList(); 
0

Вы можете разбить запрос и проверить нуль. Кроме того, Where ненужно здесь:

 using (var ctx = new MyEntities()) 
     { 
      var nm = ctx.NotificationMessages.Include("NotificationUsers") 
          .FirstOrDefault(x => x.Priority == priority); 
      IList<NotificationUser> users = null; 
      if (nm != default(NotificationMessages)) 
       users = nm.NotificationUsers.ToList(); 
      else 
       users = new List<NotificationUser>(); 
      // ... 
     } 
0

Вы могли бы написать:

 using (var ctx = new MyEntities()) 
     { 
      var users = (ctx.NotificationMessages.Include("NotificationUsers") 
          .Where(x => x.Priority == priority) 
          .Select(x => x.NotificationUsers) 
          .FirstOrDefault() ?? Enumerable.Empty<NotificationUsersType>()) 
          .ToList(); 
     }