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.IEnumerable_Sql_Profiler

 

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);
      }
   }
}

IQuarable_Sql_Profiler

Buradaki işlemlere bakarsak işleyiş şöyle devam eder. Sırayla 2 adet filtreleme işlemleri için tek bir Sql sorgusu oluşturulur. Bu sorgu Linq to Sql düzeyinde oluşturulur. Yani sorgulama direkt veritabanı(uzak veri kaynağı) üzerinden yapılır.
 

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.

 

You may also like...

5 Responses

  1. Serhat dedi ki:

    Teşekkür ederim bilgilendirme için sağolun varolun.

  2. Abdullah dedi ki:

    muhtesem az bilgi ama öz bilgi.

  3. Dursun dedi ki:

    aydınlandım güzel makale için teşekkürler

  4. Oğuzcan Genç dedi ki:

    Merhaba yazınızı çok yararlı buldum. Bu tür paylasimlarinizin devamıni dilerim

  5. Açıklayıcı buldum ilgilenenlerin okumasında fayda olacaktır.

Bir yanıt yazın

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