IEnumerable LINQ for Objects için, yani hafızadaki
List , dizi vs. sorgulaması sonucunda elde edilecek değerler için kullanılıyor.
IEnumerable bellekteti veya belleğe aldığı veriler üzerinden seçim yapar.
System.Collections isim alanında yer alır.
IQueryable ise LINQ for Database için yani veritabanından sorgulanan değerler için kullanılıyor. Bu eğer veritabanı bağlantısı varsa veritabanı üzerinde SQL sorgusu yaparak değerleri seçiyor. Tabi eğer hedef veritabanı ise.
IQueryable System.Linq isim alanında yer alır.
IEnumerable ile veritabanı bağlantısı olan bir nesne üzerinden sorgu isterseniz tüm liste hafızaya alınacak ve daha sonra bu liste üzerinden filtrelerinize göre seçme işlemi yapılacaktır.
IQueryable ile LINQ sorgusu yapıldığında ise veritabanı üzerinde çalıştırılacak sorguda tüm filtreler yer alalacak ve sadece istenen kayıtlar yüklenecektir.
IEnumerable hafızadaki koleksiyonlar için idealdir.
IQueryable hafıza dışındaki (veritabanı, servis vs.) koleksiyonlar için idealdir.
IQueryable fazladan
CreateQuery ve
Execute yöntemlerine sahiptir. Bu şekilde doğrudan özel sorguları yazıp çalıştırabiliriz.
IEnumerable bunu desteklemez.
IQueryable ve
IEnumerable'nin her ikisi de
ertelenmiş çalıştırma (Deffered Execution) kullanır. Ancak
IQueryable ertelenmiş çalıştırma işlemine benzer bir işlem olan tembel yükleme (Lazy Loading) kullanır. Yani veritabanından kayıtları siz kullanmaya başlayana kadar çağırmaz. Bu da sayfalama gibi bir çok işlemde çok faydalıdır.
Kaynak:
http://www.dotnet-tricks.com/Tutorial/linq/I8SY160612-IEnumerable-VS-IQueryable.html