C#’ta “A Lambda Expression With A Statement Body Cannot Be Converted To An Expression Tree” Hatası ve Çözümü (by Gençay)

Merhaba,

Bu içeriğimizde C#’ta Lambda ifadeleri ile çalışmamızı icra ederken karşılaşma ihtimalimiz olan “A Lambda Expression With A Statement Body Cannot Be Converted To An Expression Tree” hatası üzerine konuşuyor olacağız. Hiç vakit kaybetmeden bu hata neden alınmakta? alındıysa nasıl çaresine bakılmakta? sorularını cevaplamaya başlayalım.

Öncelike ortaya bu hatayı verecek örnek bir olay koyalım.

class MyClass
{
    Lisanca.Models.LisancaEntities VeriTabani = new Lisanca.Models.LisancaEntities();
    public void EnDogruLink<T>(string Link) where T : class, new()
    {
        T instance = VeriTabani.Set<T>().FirstOrDefault(k =>
        {

            return true;
        });
    }
}

(İlgili hatayı yukarıdaki örnek olay dışındaki herhangi bir senaryo(lar)dan da alabilirsiniz.) Dikkat ederseniz yukarıda Lambda ifadeleriyle işlem gerçekleştiren bir kod bloğumuz var. İşte bu tarz bir çalışmada konumuz olan hatayla karşılaşmaktayız.

Öncelikle bu hatayı neden aldığımızdan bahsedelim. Lambda ifadeleri IEnumerable tipinden koleksiyon yapılarında kullanılabilmek için oluşturulmuş bir expressiondır. O yüzden kullanılmaya çalışılan koleksiyon yapısının tipi çok önemlidir. Eğer ki bu tip direkt bir IEnumerable yahut 1. dereceden türevi değilse bu hatayla karşılaşılmaktadır.

Örneğimizde ilgili koleksiyonumuz DbSet tipindedir. Bu tip IEnumerable tipinden türemekte ama lokalde yapısal olarak farklılık göstermektedir. Haliyle bu koleksiyonu direkt olarak IEnumerable tipine aşağıdaki gibi çevirmemiz sorunu ortadan kaldıracaktır.

class MyClass
{
    Lisanca.Models.LisancaEntities VeriTabani = new Lisanca.Models.LisancaEntities();
    public void EnDogruLink<T>(string Link) where T : class, new()
    {
        T instance = VeriTabani.Set<T>().AsEnumerable().FirstOrDefault(k =>
        {

            return true;
        });
    }
}

Dikkat ederseniz AsEnumerable metodu bu işlem için yeterlidir.

Benzer şekilde ToList metodunuda kullanabilirdik.

class MyClass
{
    Lisanca.Models.LisancaEntities VeriTabani = new Lisanca.Models.LisancaEntities();
    public void EnDogruLink<T>(string Link) where T : class, new()
    {
        T instance = VeriTabani.Set<T>().ToList().FirstOrDefault(k =>
        {

            return true;
        });
    }
}

Nihayetinde Lambda ifadesinin kullanıldığı koleksiyon direkt olarak bir IEnumerable tipinde seyretmektedir.

İşte bu sorunun üstesinden de bu şekilde gelinebilmektedir.

Şimdilik esen kalın…

Sonraki yazılarımda görüşmek üzere… İyi çalışmalar dilerim…

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

TOP