206 votes

La séquence ne contient aucun élément ?

J'utilise actuellement une seule requête à deux endroits pour obtenir une ligne d'une base de données.

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).Single();

La requête fonctionne bien lorsqu'il s'agit de récupérer la ligne pour insérer des données dans les zones de texte, mais elle renvoie une erreur "Sequence contains no elements" lorsqu'elle est utilisée pour récupérer la ligne afin de la modifier et de la réintégrer dans la base de données. Je ne comprends pas pourquoi elle peut trouver une ligne appropriée dans un cas et pas dans un autre.

(Utilisation de ASP.NET MVC et LINQ)

507voto

Tony Kiernan Points 913

De " Correction de l'erreur LINQ : La séquence ne contient aucun élément " :

Lorsque vous obtenez l'erreur LINQ "Sequence contains no elements", c'est généralement parce que vous utilisez l'attribut First() o Single() plutôt que la commande FirstOrDefault() y SingleOrDefault() .

Cela peut également être causé par les commandes suivantes :

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastAsync()
  • Max()
  • Min()
  • Average()
  • Aggregate()

36voto

Josue Morales Points 551

Veuillez utiliser

.FirstOrDefault()

parce que si dans la première ligne du résultat il n'y a pas d'info, cette instruction va vers l'info par défaut.

14voto

bryc3monk3y Points 334

En plus de tout ce qui a été dit, vous pouvez appeler DefaultIfEmpty() avant d'appeler Single() . Cela garantit que votre séquence contient quelque chose et évite ainsi l'exception InvalidOperationException "Sequence contains no elements". Par exemple :

BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == ID
                 select p).DefaultIfEmpty().Single();

13voto

Marc Gravell Points 482669

Eh bien, qu'est-ce que ID ici ? En particulier, s'agit-il d'une variable locale ? Il y a quelques problèmes de portée / capture, ce qui signifie qu'il peut être souhaitable d'utiliser une deuxième copie de variable, juste pour la requête :

var id = ID;
BlogPost post = (from p in dc.BlogPosts
                 where p.BlogPostID == id
                 select p).Single();

De plus, s'il s'agit de LINQ-to-SQL, alors dans la version actuelle, vous obtenez un comportement légèrement meilleur si vous utilisez le formulaire :

var id = ID;
BlogPost post = dc.BlogPosts.Single(p => p.BlogPostID == id);

10voto

Diganta Kumar Points 1467

Cela résoudra le problème,

var blogPosts = (from p in dc.BlogPosts
             where p.BlogPostID == ID
             select p);
if(blogPosts.Any())
{
  var post = post.Single();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X