0Pricing
C# Academy · Ders

Derlenmiş Sorgular ve Performans

EF.CompileQuery, AsNoTracking ve Select ile projeksiyon kullanarak sorgu performansını artırın.

Derlenmiş Sorgular ve Performans, CoddyKit'te ücretsiz bir C# Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C# Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C# Academy kursu toplamda 4 dersten oluşur.

EF Core Sorgu Derlemesi

EF Core her LINQ sorgusunu çalıştırdığında ifade ağacını ayrıştırması, SQL'e çevirmesi ve doğrulaması gerekir. Sık çalıştırılan kod yollarında bu ek yük birikir. EF Core bunu en aza indirmek için çeşitli araçlar sağlar.

Salt Okunur Sorgular için AsNoTracking

AsNoTracking(), değişiklik izleyicisine kayıt ekleme işlemini atlar. Salt okunur sorgular için (API yanıtları, raporlar) bu, genellikle 2–5 kat daha hızlı olan ve daha az bellek kullanan en kolay büyük performans kazanımıdır.

// With tracking (default) — for entities you'll modify
var tracked = await _db.Products.FirstOrDefaultAsync(p => p.Id == 1);

// Without tracking — for read-only
var dto = await _db.Products
    .AsNoTracking()
    .Where(p => p.IsActive)
    .Select(p => new ProductDto { Id = p.Id, Name = p.Name })
    .ToListAsync();

Derlenmiş Sorgular

EF.CompileAsyncQuery, bir LINQ sorgusunu önceden bir temsilciye derler. Çeviri başlangıçta bir kez gerçekleşir; sonraki çağrılar derleme adımını tamamen atlar.

// Define once, reuse many times
private static readonly Func<AppDbContext, int, Task<Product?>> GetProductById =
    EF.CompileAsyncQuery(
        (AppDbContext db, int id) =>
            db.Products.AsNoTracking().FirstOrDefault(p => p.Id == id));

// Usage
var product = await GetProductById(_db, 42);

Performans için Select ile Projeksiyon

Her zaman tam olarak ihtiyacınız olan alanlara projeksiyon uygulayın. Tam bir varlık yerine veri aktarım nesnesi seçmek, alınan sütunları ve ağ üzerinden taşınan veri miktarını azaltır, çöp toplayıcı (GC) yükünü düşürür.

// Load entire entity (over-fetch)
var all = await _db.Products.ToListAsync();

// Projection: only fetch needed columns
var names = await _db.Products
    .AsNoTracking()
    .Select(p => new { p.Id, p.Name, p.Price })
    .ToListAsync();
// SQL: SELECT Id, Name, Price FROM Products

Dizin İpuçları ve Ham Sorgu Optimizasyonu

EF Core, HasIndex() ile yapılandırdığınız veritabanı dizinlerini dikkate alır. Bileşik dizinler, filtrelenmiş dizinler ve dahil edilen sütunların tümü sorgu planının performansını etkiler.

// Configure compound index in OnModelCreating
modelBuilder.Entity<Order>()
    .HasIndex(o => new { o.CustomerId, o.Status })
    .HasFilter("[Status] = 0")  // filtered index
    .IncludeProperties(o => o.PlacedAt);

// The query below will use this index efficiently
var pending = await _db.Orders
    .AsNoTracking()
    .Where(o => o.CustomerId == 5 && o.Status == OrderStatus.Pending)
    .ToListAsync();

Skip ve Take ile Sayfalama

Büyük sonuç kümelerini her zaman sayfalayın. Skip ve Take, SQL OFFSET/FETCH ifadelerine çevrilerek binlerce satırın belleğe yüklenmesini önler.

int page = 2, pageSize = 25;

var products = await _db.Products
    .AsNoTracking()
    .Where(p => p.IsActive)
    .OrderBy(p => p.Name)
    .Skip((page - 1) * pageSize)
    .Take(pageSize)
    .ToListAsync();
// SQL: ... ORDER BY Name OFFSET 25 ROWS FETCH NEXT 25 ROWS ONLY

Verimli Sayım

Kayıtları yalnızca saymak için yüklemek yerine CountAsync() veya AnyAsync() kullanın. Yalnızca var olup olmadığını kontrol etmeniz gerekiyorsa AnyAsync(), COUNT işleminden bile hızlıdır.

// Total count for pagination
int totalCount = await _db.Products
    .Where(p => p.IsActive)
    .CountAsync();

// Existence check — faster than Count > 0
bool hasExpensive = await _db.Products
    .AnyAsync(p => p.Price > 1000m);
// SQL: IF EXISTS (SELECT 1 FROM ...) SELECT 1

AddRange ile Toplu Ekleme

Birden çok varlığı aynı anda eklemek için AddRange kullanın. EF Core, INSERT işlemlerini daha az gidiş gelişte toplu olarak çalıştırır; bu işlem sağlayıcıdaki MaxBatchSize ile denetlenir.

var newProducts = Enumerable.Range(1, 1000)
    .Select(i => new Product { Name = $"Product {i}", Price = i * 1.5m })
    .ToList();

_db.Products.AddRange(newProducts);
await _db.SaveChangesAsync();
// Batched: typically 100-1000 rows per round-trip

Veritabanı İşlevleri için EF.Functions

EF.Functions, EF Core'un bellekte değerlendirmek yerine SQL'e çevirdiği veritabanına özgü işlevleri (LIKE, tarih bölümleri, tam metin araması) kullanıma sunar.

// LIKE pattern search (SQL-side)
var results = await _db.Products
    .Where(p => EF.Functions.Like(p.Name, "%keyboard%"))
    .AsNoTracking()
    .ToListAsync();

// Date difference (SQL-side)
var recentOrders = await _db.Orders
    .Where(o => EF.Functions.DateDiffDay(o.PlacedAt, DateTime.UtcNow) <= 7)
    .ToListAsync();

Yavaş Sorguları Teşhis Etme

Oluşturulan SQL'i görmek için EF Core sorgu günlük kaydını etkinleştirin. Parametre değerlerini görmek için geliştirme ortamında EnableSensitiveDataLogging() kullanın.

builder.Services.AddDbContext<AppDbContext>(opt =>
    opt.UseSqlServer(connStr)
       .LogTo(Console.WriteLine, LogLevel.Information)
       .EnableSensitiveDataLogging() // dev only!
       .EnableDetailedErrors());     // dev only!

Gerçek Dünya: Optimize Edilmiş Liste Ucu

Üretime hazır bir liste ucu, en yüksek performans için AsNoTracking, projeksiyon, dizinler ve sayfalamanın birleşiminden yararlanır.

app.MapGet("/products", async (
    AppDbContext db,
    string? search,
    int page = 1, int size = 20) =>
{
    var query = db.Products
        .AsNoTracking()
        .Where(p => p.IsActive);

    if (!string.IsNullOrEmpty(search))
        query = query.Where(p => EF.Functions.Like(p.Name, $"%{search}%"));

    var total = await query.CountAsync();
    var items = await query
        .OrderBy(p => p.Name)
        .Skip((page - 1) * size).Take(size)
        .Select(p => new { p.Id, p.Name, p.Price })
        .ToListAsync();

    return Results.Ok(new { total, items });
});

Hızlı Kontrol

EF.CompileAsyncQuery'nin normal bir LINQ sorgusuna göre temel avantajı nedir?

Özet: Derlenmiş Sorgular ve Performans

Temel çıkarımlar:

  • AsNoTracking(): salt okunur sorgularda değişiklik izleyicisini atlar — en kolay hızlı kazanım
  • EF.CompileAsyncQuery: sık çalıştırılan sorguları temsilcilere önceden derler
  • Select ile projeksiyon: yalnızca gereken sütunları getirir
  • Doğru dizinler (HasIndex) sorgu planlarını büyük ölçüde iyileştirir
  • Skip/Take ile sayfalayın; varlık kontrolleri için AnyAsync kullanın
  • Yavaş veya beklenmedik SQL'i yakalamak için geliştirme ortamında sorgu günlük kaydını etkinleştirin

Sıkça Sorulan Sorular

“Derlenmiş Sorgular ve Performans” dersi ücretsiz mi?

Evet — “Derlenmiş Sorgular ve Performans” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C# Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C# Academy kursu toplamda 4 dersten oluşur.

“Derlenmiş Sorgular ve Performans” dersinde ne öğreneceğim?

EF.CompileQuery, AsNoTracking ve Select ile projeksiyon kullanarak sorgu performansını artırın. C# Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

C# Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te C# Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“Derlenmiş Sorgular ve Performans” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu C# Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her C# Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Hevesli, Tembel ve Açık Yükleme
  2. Ham SQL, Saklı Yordamlar ve Enterpolasyon
  3. Derlenmiş Sorgular ve Performans
  4. Genel Sorgu Filtreleri ve Sahipli Varlıklar
← C# Academy Sayfasına Dön