IQueryable ile IEnumerable farklılıkları
IEnumerable ve IQueryablefarklılıklarını ve kullanımını inceleyeceğiz, bu farklılık performans açısından projelerinize çok şey katacak.
Teorik olarak:
IQueryable, Database vb. veri depolarında yapılan sorgulamlarda işlevsellik sağlar.
IEnumerable, Bir koleksiyon üzerinde sorgulama yapmanıza olanak sağlar.
İşin ince ayrıntısı işte burada, IEnumerable data’yı çeker ve sorgulamanız var ise daha sonra bu işlemi gerçekleştirir. Data’yı Memory’de tutar ve kullanır.
Peki ya 1 Milyon datam var ise ? Vuuuuuuuuu !!!
Düşünsenize 1 Milyon data var ve IEnumerable ile sorgulama yapıyorsunuz
IEnumerable q = _context.UserList.Where(x=> x.Onay=1);
Yukarıdaki kodu çalıştırdığınızda aşağıdaki adımlar işliyor.
1. Memory IEnumerable için alan açıyor ve 1 Milyon datayı içine atıyor.
2. Memory’den o datalar Where ile sorgulanıyor. (Onay = 1 ifadesi sorgulanıyor)
IQueryable, Şartlara göre bir query oluşturur ve bu query ile birlikte database’e gider. O şartlara göre sonuç döner. Teorik olarak hızı farketettik bile
Yine de görelim;
Adım adım önce IEnumerable, IQueryable ve son olarak var tipine bakalım.
IEnumerable yapısı;https://erkanguzelkucuk.files.wordpress.com/2016/07/ienumerable1.png?w=625
IQueryable yapısı;
https://erkanguzelkucuk.files.wordpress.com/2016/07/iqueryable1.png?w=625
var yapısı;
https://erkanguzelkucuk.files.wordpress.com/2016/07/varq1.png?w=625
List yapısı;https://erkanguzelkucuk.files.wordpress.com/2016/07/list.png?w=625
Çalıştıralım;
https://erkanguzelkucuk.files.wordpress.com/2016/07/console1.png?w=625
Sql Profiler ile takip edelim;
IEnumerable sorgulaması ;
https://erkanguzelkucuk.files.wordpress.com/2016/07/profie1.png?w=625
IQueryable sorgulaması ;
https://erkanguzelkucuk.files.wordpress.com/2016/07/profiq1.png?w=625
https://erkanguzelkucuk.files.wordpress.com/2016/07/42_emoticonshdcom.png?w=625
**Neeeeeee ! **
IEnumerable tüm data’yı çekip daha sonra o çektiği data’dan tekrar mı sorguluyormuş? Aman Allah’ımmmm
Sürelere baktığımız zaman var daha hızlı görünüyor peki bakalım breakpoint koyarak detayına inelim var neden bu kadar hızlıymış.
https://erkanguzelkucuk.files.wordpress.com/2016/07/console11.png?w=625
Çalışma anında var, gelen değeri en iyi nasıl saklayacağını ayarlıyor ve yapısını o şekilde belirliyor. Yani şuan için en uygunu yine IQueryable.