2010-01-05 5 views
0

J'utilise le code suivant pour extraire des données de ma base de données en utilisant des entités. Si un enregistrement n'est pas trouvé, il lève l'exception suivante "Référence d'objet non définie sur une instance d'un objet." Je peux attraper ceci pour l'arrêter causant des problèmes mais je préférerais modifier le code pour ne pas avoir le problème. Puis-je modifier la requête Linq pour qu'elle soit plus tolérante?Linq lève une exception quand rien ne doit retourner

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

Répondre

6

Le problème est que FirstOrDefault peut retourner null, et vous devez vérifier que:

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

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

bien qui est à prévoir. Vous n'avez pas de vérification nulle!

0

FirstOrDefault renvoie nul lif il n'y a pas de résultats. Vous pouvez écrire

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

ou vous pouvez écrire

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

Vous pouvez casser votre requête et vérifier null. En outre, Where est inutile ici:

 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

Vous pouvez écrire:

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