Gereksinimler ve Ön Hazırlık
Uygulamalarınızda veritabanı sıralama işlemlerini gerçekleştirebilmek için .NET 9 SDK'sının yüklü olması ve projenizde Entity Framework Core paketlerinin yapılandırılmış olması gerekir. Çalışma ortamınızda SQL Server veya SQLite gibi bir veritabanı sağlayıcısının kurulu olduğundan emin olun.
- .NET 9 SDK veya üzeri
- Entity Framework Core NuGet paketleri (Microsoft.EntityFrameworkCore.SqlServer vb.)
- Visual Studio 2022 veya VS Code
- Temel düzeyde LINQ ve C# bilgisi
LINQ ile Temel Sıralama: OrderBy ve OrderByDescending
C# içerisinde veritabanı sorgularını sıralamanın en yaygın yolu LINQ metodlarını kullanmaktır. OrderBy metodu, verileri küçükten büyüğe (artan) sıralarken, OrderByDescending metodu büyükten küçüğe (azalan) sıralama yapar. Bu işlemler doğrudan SQL sorgusuna dönüştürülür, bu sayede veritabanı sadece gerekli veriyi döndürür.
// Ürünleri fiyatlarına göre artan sırada getirme
var urunler = context.Urunler
.OrderBy(u => u.Fiyat)
.ToList();
// Ürünleri eklenme tarihine göre en yeniden eskiye sıralama
var sonEklenenler = context.Urunler
.OrderByDescending(u => u.EklenmeTarihi)
.ToList();
Yukarıdaki örnekte, veritabanı seviyesinde ORDER BY komutu oluşturulur. Belleğe tüm veriyi çekip sıralamak yerine, bu yöntemi kullanarak veritabanı motorunun gücünden faydalanırsınız.
Çoklu Kriter ile Sıralama: ThenBy ve ThenByDescending
Gerçek dünya senaryolarında, verileri tek bir sütuna göre sıralamak genellikle yetersiz kalır. Örneğin, önce kategoriye göre, ardından aynı kategori içerisindeki fiyatlara göre sıralama yapmak isteyebilirsiniz. Bu durumda ThenBy ve ThenByDescending operatörleri devreye girer.
// Önce kategori ismine göre, sonra fiyata göre sıralama
var siraliListe = context.Urunler
.OrderBy(u => u.Kategori)
.ThenBy(u => u.Fiyat)
.ToList();
Bu yapı, birincil sıralama kriteri aynı olan kayıtlar arasında ikincil bir düzenleme yapmanıza olanak tanır. ThenBy metodu, mutlaka bir OrderBy veya OrderByDescending metodundan sonra kullanılmalıdır.
Dinamik Sıralama: Kullanıcı Girdisine Göre Sıralama
Web uygulamalarında sıralama kriteri genellikle kullanıcı tarafından seçilir. Ancak, kullanıcıdan gelen string değerleri doğrudan kod içerisinde kullanmak "SQL Injection" riskini doğurabilir. Bu durumu engellemek için "switch-case" yapısı veya güvenli bir eşleme yöntemi kullanmalısınız.
public List GetirSirali(string siralaBy)
{
var sorgu = context.Urunler.AsQueryable();
sorgu = siralaBy switch
{
"fiyat" => sorgu.OrderBy(u => u.Fiyat),
"ad" => sorgu.OrderBy(u => u.Ad),
_ => sorgu.OrderBy(u => u.Id)
};
return sorgu.ToList();
}
Bu yaklaşım, kullanıcıdan gelen girdiyi kontrol altına alır ve sadece izin verilen alanlara göre sıralama yapılmasını sağlar. Güvenlik açısından, doğrudan veritabanı sütun isimlerini dışarıdan gelen parametrelerle birleştirmekten kaçınmalısınız.
Güvenlik Uyarısı: Dinamik sıralama işlemlerinde, kullanıcıdan gelen string değerleri doğrudan LINQ sorgularına "Reflection" veya "Dynamic LINQ" ile gönderirken çok dikkatli olun. Kullanıcının veritabanı şemasını keşfetmesine neden olabilecek "string concatenation" (dize birleştirme) yöntemlerinden kaçının.
Performans İpuçları ve Veritabanı Optimizasyonu
Sıralama işlemleri, özellikle büyük veri setlerinde performans kaybına yol açabilir. Veritabanı tablolarınızda sıralama yaptığınız sütunlara "Index" (indeks) eklemek, sorgu süresini milisaniyelere indirir. Ayrıca, sıralama yaparken sadece ihtiyacınız olan sütunları seçmek (Projection) bellek kullanımını azaltır.
// Sadece gerekli alanları çekerek performans artışı sağlama
var ozetListe = context.Urunler
.OrderByDescending(u => u.Fiyat)
.Select(u => new { u.Ad, u.Fiyat })
.Take(10)
.ToList();
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| OrderBy | Basit ve hızlı | Tek kriterli |
| ThenBy | Çoklu kriter desteği | Sıralı kullanım zorunluluğu |
| Dynamic LINQ | Esnek yapı | Güvenlik riski taşıyabilir |
Sıkça Sorulan Sorular
OrderBy ile ThenBy arasındaki fark nedir?
OrderBy, sıralama işlemini başlatır ve ilk kriteri belirler. ThenBy ise OrderBy veya OrderByDescending'den sonra kullanılır ve ikincil, üçüncül sıralama kriterlerini eklemek için kullanılır.
Sıralama yaparken null değerler nasıl ele alınır?
C# LINQ sorgularında null değerler varsayılan olarak sıralamanın en başında yer alır. Eğer null değerleri sona atmak isterseniz, LINQ içerisinde bir koşul (ternary operator) kullanabilirsiniz.
Veritabanında indeksleme neden önemlidir?
Sıralama (ORDER BY) işlemi, veritabanının veriyi fiziksel veya mantıksal olarak yeniden düzenlemesini gerektirir. İndeksler, veritabanının bu işlemi çok daha hızlı yapmasını sağlayan birer "içindekiler" sayfası görevi görür.
Büyük verilerde sıralama yaparken nelere dikkat etmeliyim?
Her zaman "Pagination" (sayfalama) kullanarak verileri parça parça çekin. 1 milyon satırı sıralayıp tek seferde listelemek hem veritabanını hem de uygulamanızı yavaşlatır.
AsQueryable nedir ve sıralamada ne işe yarar?
AsQueryable, sorgunun veritabanı üzerinde çalışmaya devam etmesini sağlar. Yani sıralama, filtreleme veya sayfalama işlemlerini veritabanına gitmeden önce zincirleme (chaining) şeklinde eklemenize olanak tanır.
Yasal Uyarı: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamında veritabanı işlemlerini yönetirken her zaman "Entity Framework Core" güncellemelerini takip edin ve veritabanı bağlantı dizelerinizi (connection strings) güvenli bir şekilde (Environment Variables veya Azure Key Vault) saklayın.
İleri Seviye Senaryo: Sıralama İşlemlerinde "Pagination" (Sayfalama) Entegrasyonu
Gerçek dünya uygulamalarında, veritabanındaki binlerce kaydı tek bir sayfada listelemek hem sunucu kaynaklarını tüketir hem de kullanıcı deneyimini olumsuz etkiler. Sıralama işlemleri, genellikle sayfalama (pagination) ile birlikte kullanılır. Sıralanmış bir veri setini sayfalara bölmek için Skip ve Take metodlarını kullanırız.
Aşağıdaki örnekte, belirli bir kritere göre sıralanmış verilerin nasıl sayfalara ayrıldığı gösterilmektedir:
public List GetPagedProducts(int pageNumber, int pageSize, string sortBy)
{
using (var context = new AppDbContext())
{
var query = context.Products.AsQueryable();
// Sıralama mantığı
query = sortBy switch
{
"price" => query.OrderBy(p => p.Price),
"name" => query.OrderBy(p => p.Name),
_ => query.OrderBy(p => p.Id)
};
// Sayfalama mantığı: (Sayfa No - 1) * Sayfa Boyutu kadar atla ve Sayfa Boyutu kadar al
return query.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToList();
}
}
Sıralama İşlemlerinde Hata Ayıklama (Debugging) ve İzleme
Sıralama sorgularınız beklediğiniz sonucu vermediğinde veya performans sorunları yaşattığında, Entity Framework'ün arka planda oluşturduğu SQL sorgusunu incelemek en etkili yöntemdir. Sorgunun veritabanına nasıl gönderildiğini görmek için ToQueryString() metodunu kullanabilirsiniz.
SQL Sorgusunu İzleme Adımları
- Loglama: EF Core'un yerleşik loglama mekanizmasını kullanarak tüm sorguları konsola yazdırın.
- ToQueryString: LINQ sorgunuzun sonuna
.ToQueryString()ekleyerek üretilen SQL kodunu string olarak yakalayın. - Execution Plan: Üretilen SQL kodunu SQL Server Management Studio (SSMS) üzerinde çalıştırarak "Display Estimated Execution Plan" seçeneği ile indeks kullanımını kontrol edin.
var query = context.Products.OrderBy(p => p.Price);
string sql = query.ToQueryString();
// Konsola yazdırarak SQL yapısını inceleyin
Console.WriteLine("Üretilen SQL Sorgusu: " + sql);
İpucu: Eğer sıralama işlemi sırasındaInvalidOperationExceptionalıyorsanız, genellikle sıralanacak alanın veritabanı şemasında bulunmadığı veya null değerlerin beklenmedik bir şekilde işlendiği durumlarla karşılaşıyorsunuz demektir. Her zamanOrderByöncesinde verilerin filtrelendiğinden (Where) emin olun.
Test Edilebilirlik: Birim Testlerde Sıralama Kontrolü
Sıralama mantığınızın doğru çalıştığından emin olmak için "In-Memory" veritabanı kullanarak birim testler yazabilirsiniz. Bu, veritabanına fiziksel olarak bağlanmadan sıralama algoritmanızı doğrulamanıza olanak tanır.
[Fact]
public void Products_Should_Be_Sorted_By_Price_Ascending()
{
// Arrange: Test verisi oluştur
var options = new DbContextOptionsBuilder()
.UseInMemoryDatabase(databaseName: "TestDb")
.Options;
using var context = new AppDbContext(options);
context.Products.Add(new Product { Name = "A", Price = 100 });
context.Products.Add(new Product { Name = "B", Price = 50 });
context.SaveChanges();
// Act: Sıralama metodunu çağır
var result = context.Products.OrderBy(p => p.Price).ToList();
// Assert: İlk elemanın fiyatı 50 olmalı
Assert.Equal(50, result[0].Price);
}
Sonuç
C# ile veritabanı kayıt sıralama işlemi, doğru LINQ metodlarını (OrderBy, ThenBy) kullanarak hem okunabilir hem de performanslı bir şekilde gerçekleştirilebilir. Dinamik sıralama ihtiyaçlarında güvenlikten ödün vermeden switch-case yapılarını kullanmak, uygulamanızı SQL Injection gibi saldırılara karşı koruyacaktır. Bir sonraki adım olarak, veritabanı indeksleme stratejilerini daha detaylı inceleyerek sorgularınızın hızını optimize etmeyi deneyebilirsiniz.


Yorumlar (0)
Yorum Yaz