2009-08-24 19 views
83

Aktualnie używam jednego zapytania w dwóch miejscach, aby uzyskać wiersz z bazy danych.Sekwencja nie zawiera elementów?

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

Kwerenda jest w porządku przy pobieraniu wiersz do wprowadzenia danych do pól tekstowych, ale zwraca błąd „sekwencja zawiera żadnych elementów”, kiedy używany do pobierania wiersz, aby ją edytować i umieścić go z powrotem w bazie danych. Nie mogę zrozumieć, dlaczego może znaleźć odpowiedni wiersz w jednej instancji, ale nie w innym.

(przy użyciu ASP.NET MVC i LINQ)

+11

musisz użyć SingleOrDefault, zwróci wartość null, jeśli nie zwrócono żadnych elementów –

Odpowiedz

23

umieścić punkt przerwania na tej linii, albo Debug.Print przed nim, zarówno i zobacz, co zawiera ID.

+0

Zrobiłem to i okazało się, że z jakiegoś powodu identyfikator i data są przekazywane jako null \ new (0000-0000) ze strony edycji. Strona jest silnie wpisana jako BlogPost. Na stronie edycji mam tylko pola tekstowe na tytuł i treść, identyfikator i data nie są w ogóle umieszczane na stronie. Czy to może być powód, dla którego przekazuje je jako null \ new? –

+0

Skąd spodziewano się identyfikatora? –

+6

Z tyłu, naprawdę nie jestem pewien. _

11

No, co jest ID tutaj? W szczególności czy jest to zmienna lokalna? Istnieją pewne kwestie zakres/przechwytywania, co oznacza, że ​​może być pożądane stosowanie drugą zmienną kopii, tylko dla zapytania:

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

także; czy to jest LINQ-SQL, a następnie w obecnej wersji można uzyskać nieco lepsze zachowanie w przypadku korzystania z formularza:

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

ID jest identyfikatorem GUID przekazanym jako argument –

251

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

Może to być również spowodowane przez następujące polecenia:

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

Naprawiłem mój problem. Dzięki za link! – CountMurphy

+3

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

+1

In w moim przypadku robiłem "Maksa" nad pustą sekwencją – guzart

8

To rozwiąże problemu,

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

Przyczyna błędu:

  1. Zapytanie from p in dc.BlogPosts where p.BlogPostID == ID select p zwraca sekwencję.

  2. Single() próbuje odzyskać element z sekwencji zwróconej w kroku 1.

  3. Zgodnie z wyjątkiem - Sekwencja zwrócona w kroku 1 nie zawiera żadnych elementów.

  4. Funkcja Single() próbuje odzyskać element z sekwencji zwróconej w kroku 1, która nie zawiera elementów.

  5. Od Single() nie można pobrać pojedynczego elementu z sekwencji zwróconej w kroku 1, powoduje to błąd.

Fix:

upewnić, kwerendy (from p in dc.BlogPosts where p.BlogPostID == ID select p)

powraca sekwencję z co najmniej jednego elementu.

4

Proszę używać

.FirstOrDefault() 

bo jeśli w pierwszym rzędzie wynikiem braku informacji instrukcja ta przechodzi do domyślnego informacji.