• 1 Nisan 2025 00:39

Sait ORHAN

Öğretmek için Öğrenin- Öğrenmek için Öğretin

EF Core’da Global Query Filters ile Dinamik Veri Filtreleme

Entity Framework Core, veritabanı işlemlerini kolaylaştıran ve performans optimizasyonları sağlayan güçlü bir ORM’dir. Global Query Filters özelliği sayesinde, her sorguya manuel olarak WHERE eklemek zorunda kalmadan belirli filtreleri otomatik olarak uygulayabiliriz.

Bu yazıda, Global Query Filters nedir, nasıl kullanılır ve nasıl devre dışı bırakılır gibi konulara değineceğiz.

Global Query Filters Nedir?

EF Core’un Global Query Filters özelliği, belirli bir filtreyi tüm sorgulara otomatik olarak uygulayan bir mekanizmadır.

Ne İşe Yarar?

  • Soft Delete (Yumuşak Silme) uygulamak
  • Çok tenant’lı sistemlerde (Multi-Tenancy) filtreleme yapmak
  • Kullanıcı bazlı veri erişimini kısıtlamak
  • Diğer sık kullanılan filtreleme işlemlerini otomatize etmek

Örnek Senaryo:
Diyelim ki, Product tablomuzda silinen kayıtları (IsDeleted = true) gizlemek istiyoruz.

Global Query Filters Nasıl Kullanılır?

Aşağıdaki örnekte, silinmiş ürünleri (IsDeleted = true olanları) gizlemek için bir Global Query Filter tanımlıyoruz:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Product>().HasQueryFilter(p => !p.IsDeleted);
}

Bu kod ne yapıyor?

  • DbContext.Products çağrıldığında otomatik olarak “IsDeleted = false” filtresi uygulanır.
  • Yani, silinmiş (IsDeleted = true) kayıtlar hiçbir sorguda görünmez.

Örnek Kullanım:
Aşağıdaki kodu çalıştırdığımızda, sadece silinmemiş ürünler (IsDeleted = false) getirilecektir:

var products = await _context.Products.ToListAsync();

Avantajı: Her sorguya manuel WHERE IsDeleted = false eklemeye gerek kalmaz!

Global Query Filters Nasıl Devre Dışı Bırakılır?

Peki, bazı durumlarda silinmiş ürünleri de görmek istersek ne yapmalıyız?
Bunun için IgnoreQueryFilters() metodunu kullanabiliriz.

var allProducts = await _context.Products
    .IgnoreQueryFilters()
    .ToListAsync();

Bu kod ne yapıyor?

  • IgnoreQueryFilters(), Global Query Filters’ı devre dışı bırakarak tüm kayıtları (silinmiş olanlar dahil) getirmemizi sağlar.

Koşullu Olarak Filtreyi Kaldırmak:
Bazı durumlarda, filtreyi koşula bağlı olarak kaldırmak isteyebiliriz:

public async Task<List<Product>> GetProducts(bool includeDeleted)
{
    var query = _context.Products.AsQueryable();

    if (includeDeleted)
    {
        query = query.IgnoreQueryFilters(); // Filtreyi kaldır
    }

    return await query.ToListAsync();
}

Kullanımı:

var activeProducts = await GetProducts(false); // Silinmişleri getirme
var allProducts = await GetProducts(true); // Silinmişleri de getir

Sonuç

EF Core’un Global Query Filters özelliği sayesinde veri filtreleme işlemlerini merkezi bir noktada tanımlayabilir ve her sorguya manuel WHERE ekleme zahmetinden kurtulabiliriz.

✔ Soft Delete işlemlerinde büyük kolaylık sağlar.
✔ Tenant bazlı veya kullanıcı bazlı veri yönetimini otomatize eder.
✔ Kod tekrarını azaltır ve veri yönetimini daha güvenli hale getirir.

Bir yanıt yazın

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.