2009-08-24 5 views
83

J'utilise actuellement une seule requête à deux endroits pour obtenir une ligne à partir d'une base de données.La séquence ne contient aucun élément?

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

La requête est très bien lors de la récupération de la ligne pour mettre les données dans les zones de texte, mais il renvoie une erreur « séquence ne contient aucun élément » lorsqu'il est utilisé pour récupérer la ligne afin de le modifier et de le remettre dans la base de données. Je ne comprends pas pourquoi il pourrait trouver une rangée appropriée dans un cas mais pas un autre.

(avec ASP.NET MVC et LINQ)

+11

vous devez utiliser SingleOrDefault, il renverra null si aucun élément retourné –

Répondre

23

Mettez un point d'arrêt sur cette ligne, ou Debug.Print devant elle, à la fois cas et voir ce que l'ID contient.

+0

L'a fait et a trouvé que, pour une raison quelconque, l'ID et la date sont passés comme null \ new (0000-0000) de la page d'édition. La page est fortement typée comme BlogPost. Sur la page d'édition, j'ai seulement des zones de texte pour le titre et le contenu, l'ID et la date ne sont pas mis sur la page du tout. Est-ce que cela pourrait être la raison pour laquelle il les a passés comme null \ new? –

+0

D'où attendiez-vous l'ID? –

+6

Dans la vue arrière, je ne suis vraiment pas sûr> _

11

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

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

aussi; si cela est LINQ to SQL, puis dans la version actuelle vous obtenez un comportement un peu mieux si vous utilisez le formulaire:

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

ID est un GUID transmis en tant qu'argument –

251

De "Fixing LINQ Error: Sequence contains no elements":

When you get the LINQ Error "Sequence contains no elements", this is usually because you are using the First() or Single() command rather than FirstOrDefault() and SingleOrDefault() .

Cela peut aussi être causée par les commandes suivantes:

  • FirstAsync()
  • SingleAsync()
  • Last()
  • LastOrDefault()
  • LastAsync()
  • Max()
+0

Cela a résolu mon problème. Merci pour le lien! – CountMurphy

+3

Parfait! 'ctx.Rosters.First (c => c.RosterAccess == accCode);' <- cassé 'ctx.Rosters.FirstOrDefault (c => c.RosterAccess == accCode);' <- TRAVAILLÉ –

+1

Dans mon cas, je faisais un 'Max' sur une séquence vide – guzart

8

Cela permettra de résoudre le problème,

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

Raison de l'erreur:

  1. La requête from p in dc.BlogPosts where p.BlogPostID == ID select p retourne une séquence.

  2. Single() essaie d'extraire un élément de la séquence renvoyée à l'étape 1.

  3. Selon l'exception - La séquence renvoyée à l'étape 1 ne contient aucun élément. Single() tente de récupérer un élément de la séquence renvoyée à l'étape 1 qui ne contient aucun élément.

  4. Puisque Single() n'est pas capable d'extraire un seul élément de la séquence renvoyée à l'étape 1, il renvoie une erreur.

Fix:

Assurez-vous que la demande de recherche (from p in dc.BlogPosts where p.BlogPostID == ID select p)

renvoie une séquence avec au moins un élément.

4

S'il vous plaît utiliser

.FirstOrDefault() 

parce que si dans la première rangée du résultat il n'y a pas d'info cette instruction va à l'information par défaut.

Questions connexes