2010-01-05 1 views
0

다음 코드를 사용하여 엔티티를 사용하여 데이터베이스에서 데이터를 추출합니다. 레코드가 발견되지 않으면 "개체 참조가 개체의 인스턴스로 설정되지 않았습니다."라는 예외가 발생합니다. 문제를 일으키는 것을 막기 위해이를 포착 할 수 있지만 문제가 발생하지 않도록 코드를 수정합니다. 좀 더 관용적이되도록 Linq 쿼리를 변경할 수 있습니까?Linq가 아무것도 반환하지 않을 때 예외를 throw합니다.

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

답변

6

문제는 FirstOrDefault는 null을 반환 할 수 있다는 것입니다, 당신은 확인해야합니다 예상 할 수

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

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

음. null 체크가 없습니다!

0

FirstOrDefault는 결과를 반환합니다. 당신은

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

당신은 당신의 쿼리를 중단 할 수 쓰고 널 (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>(); 
      // ... 
     } 
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(); 
     }