Die Sequenz enthält keine Elemente?


131

Ich verwende derzeit eine einzelne Abfrage an zwei Stellen, um eine Zeile aus einer Datenbank abzurufen.

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

Die Abfrage ist in Ordnung, wenn die Zeile abgerufen wird, um Daten in die Textfelder einzufügen. Sie gibt jedoch den Fehler "Sequenz enthält keine Elemente" zurück, wenn sie zum Abrufen der Zeile verwendet wird, um sie zu bearbeiten und wieder in die Datenbank einzufügen. Ich kann nicht verstehen, warum in einer Instanz eine geeignete Zeile gefunden wird, in einer anderen jedoch nicht.

(Verwenden von ASP.NET MVC und LINQ)


18
Sie müssen SingleOrDefault verwenden, es wird null zurückgeben, wenn keine Elemente zurückgegeben werden
Mahmoud Farahat

Der Fehler besagt, dass in dc.BlogPosts keine Elemente gefunden werden können, die dem Wert von ID entsprechen. Entweder hat ID keinen Wert oder die Elemente in Ihrer Liste enthalten dieses Element. Verwenden Sie SingleOrDefault oder FirstOrDefault. Diese geben ein Nullobjekt zurück, wenn kein Element gefunden wird, sondern ein Fehler.
prd82

Antworten:


32

Setzen Sie in beiden Fällen einen Haltepunkt in diese Zeile oder einen Debug.Print davor und sehen Sie, welche ID enthalten ist.


2
Haben Sie das getan und festgestellt, dass aus irgendeinem Grund die ID und das Datum von der Bearbeitungsseite als null \ new (0000-0000) übergeben werden. 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 überhaupt nicht auf die Seite gesetzt. Könnte dies der Grund dafür sein, dass sie als null \ new übergeben werden?

2
Woher erwarteten Sie den Ausweis?
Ryan Lundy

8
Im Nachhinein bin ich mir wirklich nicht sicher> _ <Dummes Problem wirklich.

367

Aus " Behebung des LINQ-Fehlers: Sequenz enthält keine Elemente ":

Wenn Sie den LINQ-Fehler "Sequenz enthält keine Elemente" erhalten, liegt dies normalerweise daran, dass Sie den Befehl First()oder Single()anstelle von FirstOrDefault()und verwenden SingleOrDefault().

Dies kann auch durch die folgenden Befehle verursacht werden:

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

3
Dies hat mein Problem behoben. Danke für den Link!
CountMurphy

5
Perfekt! ctx.Rosters.First(c => c.RosterAccess == accCode);<- gebrochen ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<- ARBEITET
Ravi Ram

2
In meinem Fall machte ich eine Maxüber eine leere Sequenz
Guzart

1
Jetzt wissen wir also, dass jede Abstimmung (im Moment) 31,25 Pfund wiegt.
B. Clay Shannon

2
Sind Sie sicher, dass LastOrDefault()dies auch diesen Fehler auslösen kann? Warum ? Ich dachte, der "OrDefault" war der
springende

22

Benutzen Sie bitte

.FirstOrDefault()

denn wenn es in der ersten Zeile des Ergebnisses keine Informationen gibt, geht diese Anweisung zu den Standardinformationen.


2
Bei asynchronem Aufruf verwenden Sie .FirstOrDefaultAsync ();
Andrea Girardi

12

Nun, was ist IDhier? Ist es insbesondere eine lokale Variable? Es gibt einige Probleme mit dem Umfang / der Erfassung, die bedeuten, dass es möglicherweise wünschenswert ist, eine zweite Variablenkopie nur für die Abfrage zu verwenden:

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

Ebenfalls; Wenn dies LINQ-to-SQL ist, erhalten Sie in der aktuellen Version ein etwas besseres Verhalten, wenn Sie das folgende Formular verwenden:

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

ID ist eine als Argument übergebene GUID

10

Dies wird das Problem lösen,

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

8

Zusätzlich zu allem, was gesagt wurde, können Sie anrufen, DefaultIfEmpty()bevor Sie anrufen Single(). Dadurch wird sichergestellt, dass Ihre Sequenz etwas enthält, und dadurch wird die InvalidOperationException "Sequenz enthält keine Elemente" abgewendet. Beispielsweise:

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

1

Grund für den Fehler:

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

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

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

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

  5. Da Single()kein einzelnes Element aus der in Schritt 1 zurückgegebenen Sequenz abgerufen werden kann, wird ein Fehler ausgegeben.

Fix:

Stellen Sie die Abfrage sicher (from p in dc.BlogPosts where p.BlogPostID == ID select p)

Gibt eine Sequenz mit mindestens einem Element zurück.


1

Ich hatte eine ähnliche Situation bei einer Funktion, die den Durchschnitt berechnet.

Beispiel:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Average();

Fall gelöst:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.