LINQ to Entities – LastOrDefault Metodunda NotSupportedException Hatası
Merhaba,
LINQ to Entities sorgularından LastOrDefault metodu ile elinizdeki veri kümesinin son elemanını elde etmek istiyor lakin aşağıdaki hatayı alıyorsanız çözümü bu içeriğimizdedir.
An unhandled exception of type ‘System.NotSupportedException’ occurred in EntityFramework.SqlServer.dll
Additional information: LINQ to Entities does not recognize the method ‘xx(System.Linq.IQueryable`1[xx])’ method, and this method cannot be translated into a store expression.
Hatamızın görsel hali aşağıdaki gibidir.
Bu hatayı almamızın sebebi, LastOrDefault metoduyla son elemanını elde etmeye çalıştığımız elimizdeki veri kümesinin bir Generic Koleksiyon yahut Array yapısında veri yapısı olmamasından kaynaklanmaktadır.
Aslında mantık çerçevesinde düşünürsek elimizdeki veri kümesi LIFO(Last In, First Out – Son Giren, İlk Çıkar) mantığıyla çalışan Stack ya da FIFO(First In, First Out – İlk Giren, İlk Çıkar) mantığıyla çalışan Queue yapılarından biri yahut benzerleri olabilir. Eee haliyle bu tarz yapılarda sonuncu eleman kavramı, LastOrDefault metodundakiyle aynı anlam ifade etmiyor olsa gerek.
İşte bu açıdan olsa gerek LastOrDefault metodu işlevselliğini Generic Koleksiyon veya Array yapısında veri kümelerine kısıtlamış olabilir.
class Program { static void Main(string[] args) { NorthwindEntities Veri = new NorthwindEntities(); Personeller SonPersonel = Veri.Personeller.LastOrDefault(); Console.WriteLine($"{SonPersonel.Adi} {SonPersonel.SoyAdi}"); Console.Read(); } }
Yukarıdaki örnek kod bloğunu incelerseniz eğer Entity Framework ile Northwind veritabanı üzerinde bir çalışma gerçekleştirilmiştir. İşte bu çalışma neticesinde ilgili hata gerçekleşecektir. Sorunun çözümünü aşağıdaki kod bloğunda olduğu gibi sağlayabiliriz.
class Program { static void Main(string[] args) { NorthwindEntities Veri = new NorthwindEntities(); Personeller SonPersonel = Veri.Personeller.ToList().LastOrDefault(); Console.WriteLine($"{SonPersonel.Adi} {SonPersonel.SoyAdi}"); Console.Read(); } }
LastOrDefault metodunu, elimizdeki veri kümesini ToList metoduyla List koleksiyonuna çevirdikten sonra hatasız bir şekilde kullanabilmekteyiz.
Tabi ilgili noktada ToArray metodunuda kullanabilirsiniz.
. . . Personeller SonPersonel = Veri.Personeller.ToArray().LastOrDefault(); . . .
İyi çalışmalar dilerim…
iyi ama bu şekilde tüm datayı db’den ram’e aktarıp bellekte bu işlemi yapmış oluyoruz.
Onun yerine ID’ye veya EklenmeTarihi gibi bir kolona göre orderbydescending yapıp firstordefault almak çözüm olabilir gibime geliyor
Tabi haklısınız ama order by yapabilmek için de gene tüm tablonun çekilmesi gerekmeyecek mi?
Gerekmeyecek, EF’i Biraz daha arastirmanizi oneririm 🙂
2016’dan 2021’e 🙂
Artık fikrim ve bilgim değişmiştir. Vesselam sevgiler…
2016-2021 arası faydalı bir tartışma olmuş
teşekkür ederim sorun halloldu süpersiniz Elhamdülillah