2009-08-24 31 views
83

Ich verwende derzeit eine einzelne Abfrage an zwei Stellen, um eine Zeile aus einer Datenbank zu erhalten.Sequenz enthält keine Elemente?

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

Die Abfrage ist in Ordnung, wenn die Zeile Abrufen von Daten in den Textfeldern zu setzen, aber es gibt einen Fehler „Sequenz enthält keine Elemente“, wenn verwendet, um die Zeile abzurufen, um sie zu bearbeiten und steckte es wieder in die Datenbank. Ich kann nicht verstehen, warum es in einem Fall eine passende Zeile findet, aber nicht in einem anderen.

(mit ASP.NET MVC und LINQ)

+11

Sie müssen SingleOrDefault verwenden, es gibt null zurück, wenn keine Elemente zurückgegeben –

Antwort

23

Setzen Sie einen Haltepunkt auf dieser Linie oder ein Debug.Print, bevor es in beide Fälle und sehen, welche ID enthält.

+0

Hat das getan und festgestellt, dass aus irgendeinem Grund die ID und das Datum als null \ neu übergeben werden (0000-0000) von der Bearbeitungsseite. Die Seite ist stark als BlogPost typisiert. Auf der Bearbeitungsseite habe ich nur Textfelder für den Titel und den Inhalt, die ID und das Datum werden nicht auf die Seite gelegt. Könnte das der Grund dafür sein, sie als null \ neu zu übergeben? –

+0

Wo haben Sie die ID erwartet? –

+6

Im Hinterkopf bin ich wirklich nicht sicher> _

11

Nun, was hier ist ID? Ist es insbesondere eine lokale Variable? Es gibt einige Umfang/capture Fragen, was bedeutet, dass es wünschenswert sein kann, eine zweite Variable Kopie zu verwenden, nur für die Abfrage:

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

auch; wenn diese LINQ-to-SQL ist, dann in der aktuellen Version erhalten Sie ein etwas besseres Verhalten, wenn Sie das Formular verwenden:

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

ID ist eine GUID, die als Argument übergeben wurde –

251

Von "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() .

Dies kann auch durch die folgenden Befehle verursacht werden:

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

Das hat mein Problem behoben. Danke für den Link! – CountMurphy

+3

Perfekt! 'ctx.Rosters.First (c => c.RosterAccess == accCode);' <- gebrochen 'ctx.Rosters.FirstOrDefault (c => c.RosterAccess == accCode);' <- WORKED –

+1

In meinem Fall habe ich ein "Max" über eine leere Sequenz gemacht. – guzart

8

Dieses Problem,

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

Grund für die Fehler lösen:

  1. Die Abfrage from p in dc.BlogPosts where p.BlogPostID == ID select p eine Sequenz zurückgibt.

  2. Single() versucht, ein Element aus der in step1 zurückgegebenen Sequenz abzurufen.

  3. Gemäß der Ausnahme - Die in Schritt1 zurückgegebene Sequenz enthält keine Elemente.

  4. Single() versucht, ein Element aus der in step1 zurückgegebenen Sequenz abzurufen, das keine Elemente enthält.

  5. Da Single() kein einzelnes Element aus der in Schritt1 zurückgegebenen Sequenz abrufen kann, wird ein Fehler ausgegeben.

Fix:

Sicherstellen, dass die Abfrage (from p in dc.BlogPosts where p.BlogPostID == ID select p)

gibt eine Sequenz mit mindestens einem Element.

4

Bitte verwenden

.FirstOrDefault() 

denn wenn in der ersten Reihe des Ergebnisses gibt es keine Informationen dieser Anweisung an die Standard-Informationen geht.

Verwandte Themen