카테고리 없음

[linq-to-entities] Linq는 반환 할 것이 없으면 예외를 throw합니다.

행복을전해요 2021. 1. 9. 02:30

문제는 FirstOrDefault가 null을 반환 할 수 있으며이를 확인해야한다는 것입니다.

var notificationMessage = ctx.NotificationMessages.Include("NotificationUsers")
                             .Where(x => x.Priority == priority)
                                                          .FirstOrDefault();
                                                          
                                                          if (notificationMessage != null) {
                                                              var users = notificationMessage.NotificationUsers.ToList();
                                                                  // ...
                                                                  }
                                                                  
-------------------
.FirstOrDefault().NotificationUsers

그것은 예상되는 것입니다. 널 체크가 없습니다!

-------------------

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();
                                                    
-------------------

쿼리를 중단하고 null을 확인할 수 있습니다. 또한 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>();
                                                                                                                    // ...
                                                                                                                           }
                                                                                                                           
-------------------

다음과 같이 작성할 수 있습니다.

       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();
                                                                                                                                     }
                                                                                                                                     


출처
https://stackoverflow.com/questions/2005963