IEnumerable mı IQueryable mı ?

Arkadaşlar uzun zaman sonra yeniden merhabalar,

Bugün sizlere, IQueryable ve IEnumerable arasındaki farklardan, ne zaman hangisini kullanacağımızdan bahsedeceğim. Ancak başlamadan önce bu arkadaşlar hakkında biraz bilgilendirme yapalım.

IEnumerable : System.Collections sınıfı altında bulunan, hafızaya alınan veriler üzerinden döngü işlemlerini gerçekleştirilmesini sağlayan interface’dir.
IQueryable : System.Linq sınıfı altında kendine yer edinen, veritabanları üzerinde kullanımı ideal olan interface’dir.

Kısaca tanımlarını yaptığımıza göre aralarındaki önemli 2 farka değinelim.

  1. Veriler üzerinde sürekli bir işlemimiz yok ise yani tablolarda değişiklik olmuyor ise IEnumerable kullanımı idealdir. IEnumerable tanımı yaparken ne demiştik ? Hatırlayalım. ‘Hafızaya alınan veriler üzerinden işlemleri gerçekleştirir’. IQueryable ise değişiklik olan tablolarda, güncel verilere ihtiyaç duyduğumuzda kullanılmalıdır.
  2. IEnumerable ve IQueryable ile yapılan aynı işlemde veritabanına gönderilen sorgu farklıdır.

‘Nasıl yani ? İkisi de verileri çekiyor, ben hep IEnumerable kullanıyorum, ne farkı vardı ki ?’ diyenler olacaktır. Olmasa bile bu makalenin sahibi yani ben, bu işlere ilk başladığında öyle yapıyordu. 🙂

Zaten bir çoğumuz bu iki interface arasındaki farkları tanım olarak biliyoruz. Ama sorunumuz uygulama kısmına geldiğinde. Hadi o zaman örneklerle aradaki farka daha yakından bakalım.

Şuradan Stack Overflow’un 2008-2010 yıllarına ait veritabınını indirip, .mdf uzantılı dosyayı, Attach işlemi ile SQL Server içerisinde oluşturuyorum.

İşlemlerimi veritabanı içerisinde bulunan Badges tablosu üzerinden gerçekleştireceğim. Tabloda 1.102.019 kayıt mevcut.

IEnumerable ile tablodaki kayıt sayısını bulalım ve SQL Profiler’da neler oluyor görelim.

Tablodaki tüm kolonlar dahil olmak üzere arka tarafa bir Select sorgusu gitti. Tabi buradaki kolonlarımız az ve sorgu çok karmaşık görünmüyor. Ancak 10, 15 ya da daha fazla kolona sahip tablolarımızda böyle bir sorgu çokta hoş görünmeyecektir.

Verilerimizi de yaklaşık 12 saniyede çekmişiz. Uzun gibi duruyor. 🙂

Şimdi de IQueryable tarafında işler nasıl oluyor ona bakalım.

IQueryable interface’ini kullanabilmemiz için Nuget üzerinden System.Linq.Dynamic paketini indiriyoruz.

Aynı sorguyu IQueryable olacak şekilde değiştiriyorum.

Arkaya gönderilen Select sorgusu da şu şekilde değişti.

Ve geldik can alıcı noktaya. 🙂 IQueryable ile işlemimiz 7 kat daha hızlı gerçekleşti.

Bugünlük anlatacaklarım bu kadar. Umarım faydalı olmuştur.

Esenle kalın. 🙂

You may also like...

3 Responses

  1. Yunus Emre dedi ki:

    Merhabalar.
    Tam olarak anlayamadım IEnumerable ‘ın daha avantajlı olduğu da bir örnek verebilir misiniz ? Yoksa her zaman IEnumerable yerine IQueryable kullanmak mı daha mantıklı olacak ?
    İyi günler.

    • Cengizhan dedi ki:

      Yunus Emre merhabalar,

      Şöyle ki; IEnumerable veriyi bir kere hafızaya alır ve iterasyon, sorgu işlemlerini hafıza üzerinden gerçekleştirir. Yani her sorgu için veritabanı bağlantısı sağlamaz. Eğer sürekli güncellenen verileriniz var ise IQueryable kullanmak daha mantıklıdır.

  2. Buse dedi ki:

    Çok güzel bir paylaşımdı çok yararı oldu teşekkürler ,

    Başarılar.

Bir cevap yazın

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