Sıra hiç öğe içermiyor mu?


131

Şu anda bir veritabanından bir satır almak için iki yerde tek bir sorgu kullanıyorum.

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

Verileri metin kutularına yerleştirmek için satırı alırken sorgu iyidir, ancak satırı düzenlemek ve veritabanına geri koymak için kullanıldığında "Sıra öğe içermiyor" hatasını döndürür. Neden bir durumda uygun bir satır bulup başka bir durumda bulamadığını anlayamıyorum.

(ASP.NET MVC ve LINQ kullanarak)


18
SingleOrDefault kullanmanız gerekir, hiçbir ürün iade edilmezse boş döndürür
Mahmoud Farahat

hata, dc.BlogPosts'ta ID değeriyle eşleşen herhangi bir öğe bulamadığını söylüyor. Kimliğin değeri yoktur veya listenizdeki öğeler bu öğeyi içerir. SingleOrDefault veya FirstOrDefault'u kullanın, bunlar herhangi bir öğe bulunmazsa hata yerine boş bir nesne döndürür.
prd82

Yanıtlar:


32

Her iki durumda da bu satıra bir kesme noktası koyun veya önüne bir Debug.Print koyun ve hangi kimliğin içerdiğini görün.


2
Bunu yaptım ve herhangi bir nedenle kimlik ve tarihin düzenleme sayfasından null \ new (0000-0000) olarak geçtiğini gördük. Sayfa kesinlikle BlogPost olarak yazılmıştır. Düzenleme sayfasında, yalnızca başlık ve içerik için metin kutuları var, kimlik ve tarih sayfaya hiç eklenmiyor. Bunları null \ new olarak geçmesinin nedeni bu olabilir mi?

2
Kimliğin nereden gelmesini bekliyordunuz?
Ryan Lundy

8
Geriye dönüp baktığımda, gerçekten emin değilim> _ <Aptalca bir sorun gerçekten.

368

" LINQ Hatası Düzeltiliyor: Sıra hiç öğe içermiyor ":

LINQ hatası "Sırada öğe yok" mesajı aldığınızda, bunun nedeni genellikle ve yerine First()veya Single()komutunu kullanmanızdır .FirstOrDefault()SingleOrDefault()

Bu, aşağıdaki komutlardan da kaynaklanabilir:

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

3
Bu benim sorunumu çözdü. Bağlantı için teşekkürler!
CountMurphy

5
Mükemmel! ctx.Rosters.First(c => c.RosterAccess == accCode);<- kırık ctx.Rosters.FirstOrDefault(c => c.RosterAccess == accCode);<- ÇALIŞTI
Ravi Ram

2
Benim durumumda Maxaşırı boş bir sekans yapıyordum
guzart

1
Artık her bir yukarı oylamanın (şu anda) 31,25 pound ağırlığında olduğunu biliyoruz.
B. Clay Shannon

2
LastOrDefault()Bunun da bu hatayı tetikleyebileceğinden emin misiniz ? Neden ?
Önemli olanın

22

Lütfen kullan

.FirstOrDefault()

çünkü sonucun ilk satırında bilgi yoksa bu talimat varsayılan bilgiye gider.


2
Zaman uyumsuz çağrı durumunda .FirstOrDefaultAsync ();
Andrea Girardi

12

Peki IDburada ne var? Özellikle, yerel bir değişken mi? Bazı kapsam / yakalama sorunları vardır; bu, yalnızca sorgu için ikinci bir değişken kopyasının kullanılmasının istenebileceği anlamına gelir:

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

Ayrıca; bu LINQ-to-SQL ise, şu anki sürümde aşağıdaki formu kullanırsanız biraz daha iyi bir davranış elde edersiniz:

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

Kimlik, bağımsız değişken olarak aktarılan bir GUID'dir

10

Bu sorunu çözecek,

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

8

Söylenen her şeye ek olarak, aramadan DefaultIfEmpty()önce arayabilirsiniz Single(). Bu, dizinizin bir şey içermesini sağlar ve böylece InvalidOperationException "Sıra hiçbir öğe içermez" ifadesini ortadan kaldırır. Örneğin:

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

2

Ortalamayı hesaplayan bir fonksiyonda benzer bir durum yaşadım.

Misal:

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

Dava çözüldü:

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

1

Hata nedeni:

  1. Sorgu from p in dc.BlogPosts where p.BlogPostID == ID select pbir sıra döndürür.

  2. Single() 1. adımda döndürülen diziden bir öğe almaya çalışır.

  3. İstisna uyarınca - step1 geri dizi herhangi bir öğe içerir.

  4. Single (), 1. adımda döndürülen ve hiçbir öğe içermeyen diziden bir öğe almaya çalışır.

  5. 1. Single()adımda döndürülen diziden tek bir öğe getirilemediği için bir hata atar.

Düzeltme:

Emin olun (from p in dc.BlogPosts where p.BlogPostID == ID select p)

en az bir eleman içeren bir sıra döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.