IEnumerable ve IQuearyble arasındaki fark
IEnumerable ve IQueryable çoğu geliştirici tarafından kullanımı karıştırılmakta ve ne zaman nerede kullanılacağı bilinmemektedir. Kod yazım tipleri birbirine çok benzerdir. Fakat kullanım yerleri işlevselliklerine göre değişir. Yanlış kullanımlar sistem performansını oldukça kötü etkiler.
IEnumerable ve IQueryable aradındaki farkı anlatmadan önce kısaca bu iki interface sınıfını tanıyalım.
IEnumerable, generic olamayan bir koleksiyon üzerinde iterasyon(liste içerisinde dönmemizi) yapmamızı sağlar. Aslında daha çok memory(bellek) üzerinde muhafıza edilen veriler üzerinden gerekli sorgulama işlemleri yapar. .Net Framework altında System.Collection isim uzayından türemektedir. IEnumerable sınıfı içerisinde sadece GetEnumerator metodu bulundurmaktadır. GetEnumerator metodu bir koleksiyon dizi içerinden iterasyon yapmamızı sağlayarak geriye IEnumerator tipinde bir sınıf döndürmektedir. Aslında bir çok yerde kullandığımız foreach döngüsü IEnumrable sınıfı üzerinden GetEnumerator işlenerek çalışmaktadır.
IQueryable, belli bir uzak veri kaynağından(web service,database…) verileri sorgulamak için işlevsellik sağlar. .Net Framework altında System.Linq isim uzayından türemektedir. IQueryable arayüzü IEnumerable arayüzünü implement etmektedir. Demek ki IEnumerable ait tüm özelliklerine sahip olabilecek.
IENUMERABLE İLE ÖRNEK SORGU
private static void GetIEnumerable() { using (var context = new EfDbContext()) { IEnumerable<Employee> employeeList = context.Employies; IEnumerable<Employee> employeeListFilter1 = employeeList.Where(x => x.Age > 5); IEnumerable<Employee> employeeListFilter2 = employeeListFilter1.Where(x => x.Age == 26); //Tüm Employee Listesini Yazdırma foreach (var item in employeeList) { Console.WriteLine("First Name:{0} - Last Name:{1} - Age:{2}\n", item.FirstName, item.LastName, item.Age); } } }
Şimdi adım adım işlemleri takip edelim. Sql Profiler tool açarak çalışma anında veritabanına giden sorguyu tespit edelim. Burada veritabanından tüm employee listesi ilk önce alındı. Alınan bu veri IEnumerable sayesinde memory(bellekte) muhafaza edilir. Daha sonra üzerinde sorgulama işlemi yaptığımız employeeListFilter1 ve employeeListFilter2 işlemleri Linq to Object düzeyinde yapılır. Yani sorgulama işlemi memory muhafaza edilen nesneler(object) üzerinden yapılır.
IQUERYABLE İLE ÖRNEK SORGU
private static void GetId() { using (var context = new EfDbContext()) { IQueryable<Employee> employeeList = context.Employies; IQueryable<Employee> employeeListFilter1 = employeeList.Where(x => x.Age > 5); IQueryable<Employee> employeeListFilter2 = employeeListFilter1.Where(x => x.Age == 26); //Tüm Employee Listesini Yazdırma foreach (var item in employeeListFilter2) { Console.WriteLine("First Name:{0} - Last Name:{1} - Age:{2}\n", item.FirstName, item.LastName, item.Age); } } }
IEnumerable ve IQueryable arasındaki temel fark,
- IEnumerable tüm verileri alıp memory de tutarak, sorgulama işlemlerini memory üzerinden yaparken IQueryable ise şartlara bağlı query oluşturarak doğrudan veritabanı üzerinden sorgulama işlemi yapar. Eğer milyonlarca kayıt üzerinde sorgulama işlemi yapıyorsak elbette IQueryable IEnumerable göre daha hızlı sorgulama işlemi yapar.
- 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.
IEnumerable lazy loading özelliğini desteklemez. IQueryable lazy loading özelliğini destekler. Bilindiği gibi lazy loading ile nesneye ihtiyaç duyulduğu zaman veri kaynağından yükleme yapılır. Örneğin, DataGrid üzerinde milyonlarca kayıtı sayfaladığmızı(Paging) düşünelim. Her sayfa için veritabanından yapılan sorgulama oldukça hızlı olacaktır.
Teşekkür ederim bilgilendirme için sağolun varolun.
muhtesem az bilgi ama öz bilgi.
aydınlandım güzel makale için teşekkürler
Merhaba yazınızı çok yararlı buldum. Bu tür paylasimlarinizin devamıni dilerim
Açıklayıcı buldum ilgilenenlerin okumasında fayda olacaktır.