Reeks bevat geen elementen?

Ik gebruik momenteel een enkele zoekopdracht op twee plaatsen om een rij uit een database te halen.

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

De query is prima bij het ophalen van de rij om gegevens in de tekstvakken te plaatsen, maar het retourneert een fout “Sequence bevat geen elementen” wanneer gebruikt om de rij op te halen om deze te bewerken en terug in de database te plaatsen . Ik begrijp niet waarom het in het ene geval wel een geschikte rij kan vinden, maar niet in het andere.

(Met ASP.NET MVC en LINQ)


Antwoord 1, autoriteit 100%

Van “Fixing LINQ-fout: reeks bevat geen elementen“:

Als u de LINQ-fout “Sequence bevat geen elementen” krijgt, komt dit meestal omdat u de opdracht First()of Single()gebruikt in plaats van FirstOrDefault()en SingleOrDefault().

Dit kan ook worden veroorzaakt door de volgende opdrachten:

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

Antwoord 2, autoriteit 7%

Gebruik

.FirstOrDefault()

omdat als er in de eerste rij van het resultaat geen info staat, gaat deze instructie naar de standaard info.


Antwoord 3, autoriteit 3%

Nou, wat is IDhier? Is het in het bijzonder een lokale variabele? Er zijn enkele scope / capture-problemen, wat betekent dat het wenselijk kan zijn om een ​​tweede variabele kopie te gebruiken, alleen voor de query:

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

ook; Als dit LINQ-TO-SQL is, dan krijgt u in de huidige versie een iets beter gedrag als u het formulier gebruikt:

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

Antwoord 4, Autoriteit 2%

Hiermee wordt het probleem opgelost,

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

Antwoord 5, Autoriteit 2%

Naast al het andere dat is gezegd, kunt u DefaultIfEmpty()bellen voordat u het Single()belt. Dit zorgt ervoor dat uw sequentie iets bevat en daardoor verdrijft de elledOperionException “-sequentie bevat geen elementen”. Bijvoorbeeld:

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

Antwoord 6

Ik had een vergelijkbare situatie op een functie die het gemiddelde berekent.

Voorbeeld:

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

Case opgelost:

ws.Cells[lastRow, startingmonths].Value = lstMediaValues.Count == 0 ? 0 : lstMediaValues.Average();

Antwoord 7

Reden voor fout:

  1. De query from p in dc.BlogPosts where p.BlogPostID == ID select pRetourneert een reeks.

  2. Single()probeert een element op te halen van de sequentie die in stap 1 is geretourneerd.

  3. volgens de uitzondering – De sequentie die wordt geretourneerd in stap 1 bevat geen elementen.

  4. Single () probeert een element op te halen uit de geretureerde sequentie in stap 1 die geen elementen bevat.

  5. Aangezien Single()niet in staat is om een ​​enkel element uit de volgorde terug te halen in stap 1, gooit het een fout.

Fix:

Zorg ervoor dat de query (from p in dc.BlogPosts where p.BlogPostID == ID select p)

selecteren

retourneert een sequentie met ten minste één element.

Other episodes