Ana içeriğe geç

LINQ: IQueryable ve IEnumerable Arasındaki Farklar

LINQ ile çalışırken IQueryable ve IEnumerable arayüzleri arasında doğru seçim yapmak, performans ve sorgu davranışı açısından kritik öneme sahiptir. Bu iki arayüzün işleyişi ve kullanım alanları farklıdır.


1. IQueryable Nedir?

  • Tanım: Sorgunun veritabanı veya uzak bir kaynaktan yürütülmesine olanak tanır.
  • Çalışma Prensibi: Sorgular, veritabanına gönderilir ve işlenir (deferred execution).

Örnek:

using var context = new AppDbContext();

IQueryable<Customer> query = context.Customers.Where(c => c.IsActive);
var activeCustomers = query.ToList(); // Sorgu burada çalışır

IQueryable sayesinde sorgu, veritabanında çalıştırılır ve sadece ihtiyaç duyulan veriler çekilir.


2. IEnumerable Nedir?

  • Tanım: Veriyi belleğe yükler ve bellekte işleme alır.
  • Çalışma Prensibi: Sorgular, bellekte yürütülür.

Örnek:

IEnumerable<Customer> customers = context.Customers.ToList();
var activeCustomers = customers.Where(c => c.IsActive).ToList(); // Filtreleme bellekte yapılır

IEnumerable, tüm veriyi belleğe çeker ve filtreleme işlemi bellek üzerinde yapılır.


3. Yanlış ve İdeal Kullanım

Yanlış Kullanım: Büyük veri kümelerini belleğe çekmek

Yanlış Kullanım:

var allCustomers = context.Customers.ToList(); // Tüm veriyi belleğe çeker
var activeCustomers = allCustomers.Where(c => c.IsActive).ToList();

Bu yaklaşım, büyük veri kümeleri için gereksiz bellek tüketimine yol açar.


İdeal Kullanım: Sorguları veritabanında çalıştırmak

İdeal Kullanım:

var activeCustomers = context.Customers
    .Where(c => c.IsActive)
    .ToList(); // Sorgu doğrudan veritabanında çalışır

Bu yöntem, yalnızca gerekli veriyi çekerek bellek tüketimini optimize eder.


4. IQueryable ve IEnumerable Farkları

Özellik IQueryable IEnumerable
Çalışma Yeri Veritabanı veya uzak kaynak Bellek
Performans Daha iyi (sorgu kaynağında çalıştırılır) Daha düşük (veri bellekte işlenir)
Kullanım Alanı Büyük veri kümeleri, veritabanı sorguları Küçük veri kümeleri, bellek işlemleri
Lazy Execution Evet Evet
Sorgu İşleme SQL gibi sorgu dilleri Bellek üstünde LINQ

5. Dinamik Sorgu Örneği

Örnek: Kullanıcı girişine bağlı sorgu

public List<Customer> GetCustomers(bool onlyActive)
{
    using var context = new AppDbContext();

    IQueryable<Customer> query = context.Customers;

    if (onlyActive)
    {
        query = query.Where(c => c.IsActive);
    }

    return query.ToList();
}

Bu yöntem, sorguları yalnızca ihtiyaç duyulan verilere göre dinamik olarak optimize eder.


6. Performans Testi

IQueryable ve IEnumerable arasındaki performans farkını test etmek için aşağıdaki kodu kullanabilirsiniz:

Performans Testi:

var stopwatch = Stopwatch.StartNew();

// IQueryable ile
var activeCustomersQuery = context.Customers.Where(c => c.IsActive).ToList();
stopwatch.Stop();
Console.WriteLine($"IQueryable Süresi: {stopwatch.ElapsedMilliseconds} ms");

stopwatch.Restart();

// IEnumerable ile
var allCustomers = context.Customers.ToList();
var activeCustomersEnum = allCustomers.Where(c => c.IsActive).ToList();
stopwatch.Stop();
Console.WriteLine($"IEnumerable Süresi: {stopwatch.ElapsedMilliseconds} ms");

7. Hangi Durumda Hangisi Kullanılmalı?

Durum Tercih Edilen Arayüz
Veritabanı işlemleri IQueryable
Bellekte küçük veri kümeleriyle çalışma IEnumerable
Dinamik sorgu oluşturma IQueryable
Performans kritik olan büyük veri setleri IQueryable