C# İle Linq Sorguları Kullanarak Veri Filtreleme İşlemi Nasıl Yapılır?

C# İle Linq Sorguları Kullanarak Veri Filtreleme İşlemi Nasıl Yapılır?
C# İle Linq Sorguları Kullanarak Veri Filtreleme İşlemi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Linq ile çalışmaya başlamadan önce sisteminizde .NET 8 veya üzeri bir SDK'nın yüklü olması önerilir. Geliştirme ortamı olarak Visual Studio 2022 veya güncel VS Code sürümlerini kullanabilirsiniz. Projenizde System.Linq kütüphanesinin dahil olduğundan emin olmalısınız.

  • .NET SDK 8.0 veya daha yeni bir sürüm.
  • C# 12.0 veya üzeri dil özellikleri.
  • using System.Linq; kütüphanesinin dosya başında tanımlanması.

Linq Where Metodu ile Temel Veri Filtreleme

Linq sorgularında filtreleme yapmanın en temel yolu Where metodunu kullanmaktır. Bu metot, bir koşul (predicate) alır ve bu koşulu sağlayan tüm öğeleri döndürür. Aşağıdaki örnekte, bir tam sayı listesinden sadece çift sayıları filtreliyoruz.

using System;
using System.Collections.Generic;
using System.Linq;

List sayilar = new List { 1, 2, 3, 4, 5, 6, 7, 8 };
var ciftSayilar = sayilar.Where(s => s % 2 == 0).ToList();

foreach (var sayi in ciftSayilar)
{
    Console.WriteLine(sayi);
}

Burada s => s % 2 == 0 ifadesi bir lambda ifadesidir. C# derleyicisi bu ifadeyi bir fonksiyon olarak değerlendirir ve listedeki her eleman için çalıştırır. Sonuç olarak ToList() metodu ile sorguyu çalıştırıp belleğe alıyoruz.

Nesne Koleksiyonlarında Filtreleme

Gerçek dünya uygulamalarında genellikle basit tipler yerine karmaşık nesnelerle çalışırız. Bir "Ürün" sınıfı üzerinden belirli bir fiyat aralığındaki ürünleri nasıl filtreleyeceğimize bakalım.

public class Urun
{
    public string Ad { get; set; }
    public decimal Fiyat { get; set; }
}

List urunler = new List
{
    new Urun { Ad = "Laptop", Fiyat = 25000 },
    new Urun { Ad = "Mouse", Fiyat = 500 },
    new Urun { Ad = "Klavye", Fiyat = 1200 }
};

var uygunFiyatli = urunler.Where(u => u.Fiyat < 5000).ToList();

Bu yöntem, nesne tabanlı programlamada veri erişim katmanlarını yönetirken oldukça pratiktir. Where metodu, LINQ to Objects yapısında oldukça hızlı çalışır ancak çok büyük veri setlerinde performans analizi yapmanız gerekebilir.

Linq Sorgularında Çoklu Koşul Kullanımı

Bazen verileri filtrelerken birden fazla kriteri aynı anda sağlamanız gerekir. Bunun için && (VE) veya || (VEYA) mantıksal operatörlerini kullanabilirsiniz.

var filtrelenmisUrunler = urunler.Where(u => u.Fiyat > 1000 && u.Ad.StartsWith("K")).ToList();

Bu kod bloğu, hem fiyatı 1000'den büyük olan hem de ismi "K" harfi ile başlayan ürünleri getirir. StartsWith gibi string metodları, Linq sorguları içerisinde oldukça güçlü filtreleme imkanları sunar.

Linq Yöntemlerinin Karşılaştırmalı Özeti

Yöntem Avantajı Dezavantajı
Method Syntax (Where) Zincirleme işlem kolaylığı, okunabilirlik. Çok karmaşık sorgularda karmaşıklaşabilir.
Query Syntax (from...where) SQL benzeri yapı, SQL bilenler için kolay. Bazı özel metodlara erişim kısıtlı olabilir.

Ertelenmiş İcra (Deferred Execution) Kavramı

Linq sorgularının en kritik özelliği "Ertelenmiş İcra"dır. Yani, sorguyu tanımladığınız an değil, veriyi kullanmaya başladığınız (örneğin foreach veya ToList) an çalışır. Bu, performans açısından büyük bir avantajdır.

var sorgu = urunler.Where(u => u.Fiyat > 1000);
// Sorgu henüz çalışmadı!
urunler.Add(new Urun { Ad = "Monitör", Fiyat = 3000 });
// Şimdi çalıştı ve yeni eklenen ürünü de kapsar.
var sonuc = sorgu.ToList();

Dikkat: Sorgu sonuçlarını bir listeye atamadan önce veritabanı veya liste üzerinde değişiklik yaparsanız, sorgu sonucu bu değişikliklerden etkilenir. Eğer verinin o anki halini sabitlemek istiyorsanız mutlaka ToList() veya ToArray() metotlarını kullanarak sorguyu hemen icra edin.

Yaygın Hatalar ve Debug İpuçları

Linq kullanırken en sık yapılan hata, null referans kontrolü yapmadan filtreleme yapmaktır. Koleksiyonunuz boşsa veya içindeki bir özellik null ise NullReferenceException alabilirsiniz.

// Güvenli filtreleme örneği
var guvenliListe = urunler.Where(u => u?.Ad != null && u.Fiyat > 100).ToList();

Debug yaparken, sorgunuzun sonucunu görmek için Visual Studio'nun "Quick Watch" penceresini kullanabilir veya sorguyu var yerine doğrudan IEnumerable tipinde tanımlayarak tip güvenliğini kontrol edebilirsiniz.

Güvenlik Uyarısı: Kullanıcıdan alınan verilerle Linq sorgusu oluştururken, doğrudan string birleştirme (concatenation) yapmayın. Eğer Entity Framework gibi bir ORM kullanıyorsanız, parametreli sorgular kullanarak SQL Injection riskini minimize edin.

Sıkça Sorulan Sorular

Linq sorgusunda neden ToList() kullanmalıyım?

Linq sorguları varsayılan olarak IEnumerable döner ve ertelenmiş icra prensibiyle çalışır. Veriyi o anki haliyle belleğe almak ve üzerinde işlem yapmak için ToList() ile sorguyu tetiklemelisiniz.

Büyük veri setlerinde Linq yavaş mı?

Linq to Objects, bellek içi koleksiyonlarda oldukça hızlıdır. Ancak milyonlarca satırlık verilerde IQueryable kullanarak veritabanı tarafında filtreleme yapılması, verinin belleğe çekilmeden süzülmesini sağlar ve performansı artırır.

Where metodu ile FirstOrDefault farkı nedir?

Where bir koleksiyon (liste) döndürürken, FirstOrDefault koşulu sağlayan ilk elemanı döndürür. Eleman bulunamazsa null döner.

Linq sorgularını nasıl test edebilirim?

xUnit veya NUnit gibi test kütüphaneleri kullanarak, yazdığınız filtreleme metodlarını farklı veri setleri ile birim testlerinden (unit test) geçirebilirsiniz.

Performans için sorgu sıralaması önemli mi?

Evet, en kısıtlayıcı koşulu Where içerisinde en başa koymak, sorgunun daha az eleman üzerinde işlem yapmasını sağlayarak performansı optimize eder.

LINQ Sorgularında İleri Seviye Performans Optimizasyonu ve İpuçları

LINQ sorgularının performansını artırmak, özellikle büyük veri kümeleriyle çalışırken uygulamanızın yanıt süresini doğrudan etkiler. Sadece Where metodu değil, veri setine erişim biçiminiz de kritik bir rol oynar. Bellek yönetimi ve işlemci döngülerini optimize etmek için aşağıdaki stratejileri göz önünde bulundurmalısınız.

IQueryable vs IEnumerable: Ne Zaman Hangisi Kullanılmalı?

Filtreleme işlemlerinde IQueryable ve IEnumerable arasındaki farkı anlamak, veritabanı performansını optimize etmenin anahtarıdır. IEnumerable, veriyi belleğe çektikten sonra filtreleme yaparken; IQueryable, filtreleme ifadesini SQL sorgusuna dönüştürerek veritabanı seviyesinde çalıştırır.

// Yanlış: Tüm veriyi belleğe çeker (IEnumerable)
var kullanicilar = context.Kullanicilar.ToList().Where(k => k.AktifMi);

// Doğru: Veritabanı seviyesinde filtreleme yapar (IQueryable)
var aktifKullanicilar = context.Kullanicilar.Where(k => k.AktifMi).ToList();

LINQ Sorgularında İndeks Kullanımı ve Sorgu Planı

Veritabanı üzerinde çalışan LINQ sorgularında, filtreleme yaptığınız sütunların veritabanı tarafında indekslenmiş olması gerekir. İndekslenmemiş sütunlar üzerinde yapılan Where filtrelemeleri, veritabanının "Table Scan" yapmasına neden olur ve bu da büyük tablolarda ciddi yavaşlamalara yol açar.

  • Sorgu Planı Analizi: SQL Profiler veya veritabanı yönetim araçlarını kullanarak LINQ sorgunuzun ürettiği SQL çıktısını inceleyin.
  • String Aramaları: Contains() metodu SQL tarafında LIKE '%metin%' sorgusuna dönüşür. Bu, indekslerin kullanılamamasına sebep olan en büyük performans katillerinden biridir.

Karmaşık Filtreleme Senaryoları: PredicateBuilder Kullanımı

Dinamik olarak değişen filtreleme koşullarına sahipseniz (örneğin bir arama ekranında kullanıcının seçtiği filtreler), standart Where metodu yetersiz kalabilir. Bu durumda PredicateBuilder gibi yardımcı yapılar kullanarak çalışma zamanında (runtime) dinamik sorgular oluşturabilirsiniz.

// Dinamik bir filtreleme örneği
var predicate = PredicateBuilder.New();

if (!string.IsNullOrEmpty(aramaTerimi))
{
    predicate = predicate.And(u => u.Ad.Contains(aramaTerimi));
}

if (minFiyat.HasValue)
{
    predicate = predicate.And(u => u.Fiyat >= minFiyat.Value);
}

var sonuc = context.Urunler.Where(predicate).ToList();

Bu yaklaşım, kodunuzu karmaşık if-else bloklarından kurtarır ve sorgularınızın okunabilirliğini ciddi oranda artırır. Dinamik sorgulama yaparken, her zaman sorgunun nihai halinin veritabanı üzerinde verimli çalışıp çalışmadığını kontrol etmeyi ihmal etmeyin.

Sonuç

C# ile Linq sorgularını kullanarak veri filtreleme yapmak, kodunuzun daha temiz, sürdürülebilir ve performanslı olmasını sağlar. Bu rehberde öğrendiğiniz Where metodu, lambda ifadeleri ve ertelenmiş icra prensibi, profesyonel yazılım geliştirme süreçlerinin temel taşlarıdır. Bir sonraki adım olarak, Select, OrderBy ve GroupBy gibi diğer Linq operatörlerini keşfederek veri işleme yeteneklerinizi bir üst seviyeye taşıyabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Kerem Aydın

Mutfağından bahçesine, yaşamın her alanında hızlı ve etkili çözüm rehberleri hazırlıyorum. Bilgi kirliliğinden uzak, doğrudan sonuca odaklanan içerikler üretiyorum.

Yorumlar (0)

Yorum Yaz