Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

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.

LINQ to Entities - LastOrDefault Metodunda NotSupportedException Hatası

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…

Bunlar da hoşunuza gidebilir...

6 Cevaplar

  1. Ali dedi ki:

    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

  2. halil dedi ki:

    Gerekmeyecek, EF’i Biraz daha arastirmanizi oneririm 🙂

  3. rangadungafat dedi ki:

    2016-2021 arası faydalı bir tartışma olmuş

halil için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir