Linq выдает исключение, когда нечего возвращать - PullRequest
0 голосов
/ 05 января 2010

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

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

Ответы [ 5 ]

6 голосов
/ 05 января 2010

Проблема в том, что FirstOrDefault может вернуть ноль, и вам нужно проверить это:

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

if (notificationMessage != null) {
    var users = notificationMessage.NotificationUsers.ToList();
    // ...
}
0 голосов
/ 05 января 2010

Вы можете написать:

       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();
       }
0 голосов
/ 05 января 2010

Вы можете разорвать ваш запрос и проверить на ноль. Кроме того, 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 голосов
/ 05 января 2010

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

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 голосов
/ 05 января 2010
.FirstOrDefault().NotificationUsers

Ну, этого следовало ожидать. У вас нет нулевой проверки!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...