IQueryable IEnumerable Farklar

Husamettin Elalmis

IQueryable IEnumerable Farklar

Merhaba arkadaşlar, bu yazıda sizlere IQueryable ile IEnumerable arasındaki farklılıklardan bahsecedeğim.

IEnumerable

  • Liste üzerinde iterasyon yapmamızı sağlar

  • Memory üzerinde muhafaza edilir, memory üzerinde sorgulama yapar

  • GetEnumerator interfaceini otomatik olarak kullanarak foreach içerisinde dönmemizi sağlar

  • System.Collection namespaceinden türer

IQueryable

  • Uzak veri kaynağından veriyi çeker (database, webservice vb.)

  • Verileri sorgulamak için işlevsellik sağlar

  • System.Linq namespaceinden türer

  • IEnumerable interfacesinden implement edilmiştir

  • IEnumerabledeki tüm özelliklere sahiptir

IEnumerable ve IQueryable Farklılıkları

  • IEnumerable tüm veriyi alıp memoryde tutar, sorgulama işlemlerini memory üzerinde yapar.

  • IQueryable ise queryi oluşturarak doğrudan veritabanı üzerinden sorgulama işlemi yapar.

  • Milyonlarca kayıt üzerinde sorgulama işlemi yapılacak ise IQueryable kullanılmalıdır. IEnumerablea göre daha hızlı sorgulama işlemi yapar.

  • IEnumerable memorydeki kolleksiyonlar için idealdir.

  • IQueryable memory dışındaki (veritabanı, servis vb.) koleksiyonlar için idealdir.

  • IQueryable fazladan, IQueryProvider altında var olan CreateQuery ve Execute yöntemlerine sahiptir. Bu sayede doğrudan özel sorgular(expressionlar) yazıp çalıştırılabilir. IEnumerable bunu desteklemez.

  • IEnumerable lazy loading özelliğini desteklemez, IQueryable lazy loading özelliğini destekler.

  • LazyLoading nesneye ihtiyaç duyulduğu zaman veri kaynağından yükleme yapar (pagination)

IQueryable Üzerinde Predicate Kullanmak

  • Dynamic query oluşturmak için kullanılır

var keywords=new List<string>(){ "Test1","Test2" };

var predicate = PredicateBuilder.False<t_Users>();

foreach (var key in keywords)

{

predicate = predicate.Or (a => a.Text.Contains (key));

}

var query = context. t_Users.AsQueryable().Where(predicate);

IQueryable Üzerinde Predicate Filter Kullanmak

  • Parametre olarak lambda expression geçilmesini sağlar

Public IQuerayle<t_Users> GetAll(IQueryable<t_Users> list, Expression<Func<string, bool>> filter)

{

return list.Where(filter);

}

Sonuç

  • Bu dokumanda IQueryable ve IEnumerabler farklılıklarını görmüş olduk

  • IQueryable database seviyesinde daha etkin kullanılabildiğini gördük

Saygılarımla,

Hüsamettin ELALMIŞ – 29.05.2022

[email protected]

Last updated