Skip to content

Entity Framework - Advanced Querying

Giriş

Entity Framework'te ileri seviye sorgulama teknikleri, veritabanı işlemlerini daha verimli ve esnek bir şekilde gerçekleştirmeyi sağlar. Mid-level geliştiriciler için bu teknikler kritik öneme sahiptir.

Advanced Querying'in Önemi

  1. Performans
  2. Daha verimli sorgular
  3. Daha az veritabanı yükü
  4. Daha iyi sorgu planları
  5. Daha hızlı yanıt süreleri

  6. Esneklik

  7. Karmaşık sorgular
  8. Dinamik sorgular
  9. Özelleştirilmiş sorgular
  10. Verimli veri filtreleme

  11. Bakım

  12. Daha temiz kod
  13. Daha kolay debug
  14. Daha iyi test edilebilirlik
  15. Daha kolay bakım

Advanced Querying Teknikleri

  1. LINQ to Entities

    // Temel sorgu
    var blogs = await _context.Blogs
        .Where(b => b.Rating > 3)
        .OrderByDescending(b => b.CreatedDate)
        .ToListAsync();
    
    // Include ile ilişkili veriler
    var blogs = await _context.Blogs
        .Include(b => b.Posts)
            .ThenInclude(p => p.Comments)
        .ToListAsync();
    
    // Projection
    var blogTitles = await _context.Blogs
        .Select(b => new BlogDto
        {
            Id = b.Id,
            Title = b.Title,
            PostCount = b.Posts.Count
        })
        .ToListAsync();
    
    // Group by
    var blogGroups = await _context.Blogs
        .GroupBy(b => b.Category)
        .Select(g => new
        {
            Category = g.Key,
            Count = g.Count(),
            AverageRating = g.Average(b => b.Rating)
        })
        .ToListAsync();
    

  2. Raw SQL Queries

    // Temel raw SQL
    var blogs = await _context.Blogs
        .FromSqlRaw("SELECT * FROM Blogs WHERE Rating > {0}", 3)
        .ToListAsync();
    
    // Stored procedure
    var blogs = await _context.Blogs
        .FromSqlRaw("EXEC GetTopRatedBlogs @MinRating = {0}", 3)
        .ToListAsync();
    
    // View kullanımı
    var blogStats = await _context.BlogStats
        .FromSqlRaw("SELECT * FROM vw_BlogStatistics")
        .ToListAsync();
    
    // Parametreli sorgu
    var blogs = await _context.Blogs
        .FromSqlInterpolated($"SELECT * FROM Blogs WHERE Rating > {minRating} AND Category = {category}")
        .ToListAsync();
    

  3. Compiled Queries

    // Compiled query tanımlama
    private static readonly Func<ApplicationDbContext, int, Task<Blog>> GetBlogById =
        EF.CompileAsyncQuery((ApplicationDbContext context, int id) =>
            context.Blogs.FirstOrDefault(b => b.Id == id));
    
    // Compiled query kullanımı
    var blog = await GetBlogById(_context, 1);
    
    // Parametreli compiled query
    private static readonly Func<ApplicationDbContext, int, string, Task<Blog>> GetBlogByTitle =
        EF.CompileAsyncQuery((ApplicationDbContext context, int id, string title) =>
            context.Blogs.FirstOrDefault(b => b.Id == id && b.Title == title));
    

  4. Dynamic Queries

    // Dinamik sorgu oluşturma
    public IQueryable<Blog> GetFilteredBlogs(BlogFilter filter)
    {
        var query = _context.Blogs.AsQueryable();
    
        if (filter.Category != null)
        {
            query = query.Where(b => b.Category == filter.Category);
        }
    
        if (filter.MinRating.HasValue)
        {
            query = query.Where(b => b.Rating >= filter.MinRating.Value);
        }
    
        if (filter.StartDate.HasValue)
        {
            query = query.Where(b => b.CreatedDate >= filter.StartDate.Value);
        }
    
        return query;
    }
    
    // Expression kullanımı
    public IQueryable<Blog> GetFilteredBlogs(Expression<Func<Blog, bool>> filter)
    {
        return _context.Blogs.Where(filter);
    }
    

  5. Complex Queries

    // Subquery
    var blogs = await _context.Blogs
        .Where(b => b.Posts.Any(p => p.Comments.Count > 10))
        .ToListAsync();
    
    // Join
    var blogPosts = await _context.Blogs
        .Join(_context.Posts,
            b => b.Id,
            p => p.BlogId,
            (b, p) => new { Blog = b, Post = p })
        .ToListAsync();
    
    // Union
    var allContent = await _context.Blogs
        .Select(b => new { Type = "Blog", Title = b.Title })
        .Union(_context.Posts.Select(p => new { Type = "Post", Title = p.Title }))
        .ToListAsync();
    

Best Practices

  1. Query Tasarımı
  2. Eager loading kullanımı
  3. Projection kullanımı
  4. Compiled query kullanımı
  5. Batch processing
  6. Pagination

  7. Performans

  8. Index kullanımı
  9. Query optimizasyonu
  10. Caching stratejileri
  11. Batch processing
  12. Resource yönetimi

  13. Güvenlik

  14. SQL injection önleme
  15. Parametre kullanımı
  16. Input validation
  17. Access control
  18. Audit logging

  19. Bakım

  20. Kod organizasyonu
  21. Documentation
  22. Testing
  23. Version control
  24. Error handling

Mülakat Soruları

Temel Sorular

  1. Entity Framework'te LINQ to Entities nedir?
  2. Cevap: LINQ to Entities, Entity Framework'te veritabanı sorgularını nesne yönelimli bir şekilde yazmayı sağlayan bir teknolojidir.

  3. Entity Framework'te raw SQL sorguları ne zaman kullanılır?

  4. Cevap: Karmaşık sorgular, stored procedure'ler, view'lar veya performans gerektiren durumlarda kullanılır.

  5. Entity Framework'te compiled query nedir?

  6. Cevap: Compiled query, sorgunun bir kez derlenip tekrar tekrar kullanılmasını sağlayan bir optimizasyon tekniğidir.

  7. Entity Framework'te dynamic query nedir?

  8. Cevap: Runtime'da oluşturulan ve değişen sorgulardır. Expression'lar veya IQueryable kullanılarak oluşturulur.

  9. Entity Framework'te complex query nedir?

  10. Cevap: Subquery, join, union gibi karmaşık veritabanı işlemlerini içeren sorgulardır.

Teknik Sorular

  1. LINQ to Entities ile nasıl karmaşık sorgu yazılır?
  2. Cevap:

    var blogs = await _context.Blogs
        .Include(b => b.Posts)
            .ThenInclude(p => p.Comments)
        .Where(b => b.Rating > 3)
        .GroupBy(b => b.Category)
        .Select(g => new
        {
            Category = g.Key,
            Count = g.Count(),
            AverageRating = g.Average(b => b.Rating)
        })
        .ToListAsync();
    

  3. Raw SQL sorguları nasıl yazılır?

  4. Cevap:

    var blogs = await _context.Blogs
        .FromSqlRaw("SELECT * FROM Blogs WHERE Rating > {0}", 3)
        .ToListAsync();
    
    var blogs = await _context.Blogs
        .FromSqlInterpolated($"SELECT * FROM Blogs WHERE Rating > {minRating}")
        .ToListAsync();
    

  5. Compiled query nasıl oluşturulur?

  6. Cevap:

    private static readonly Func<ApplicationDbContext, int, Task<Blog>> GetBlogById =
        EF.CompileAsyncQuery((ApplicationDbContext context, int id) =>
            context.Blogs.FirstOrDefault(b => b.Id == id));
    
    var blog = await GetBlogById(_context, 1);
    

  7. Dynamic query nasıl oluşturulur?

  8. Cevap:

    public IQueryable<Blog> GetFilteredBlogs(BlogFilter filter)
    {
        var query = _context.Blogs.AsQueryable();
    
        if (filter.Category != null)
        {
            query = query.Where(b => b.Category == filter.Category);
        }
    
        if (filter.MinRating.HasValue)
        {
            query = query.Where(b => b.Rating >= filter.MinRating.Value);
        }
    
        return query;
    }
    

  9. Complex query nasıl yazılır?

  10. Cevap:
    var blogs = await _context.Blogs
        .Where(b => b.Posts.Any(p => p.Comments.Count > 10))
        .Join(_context.Posts,
            b => b.Id,
            p => p.BlogId,
            (b, p) => new { Blog = b, Post = p })
        .ToListAsync();
    

İleri Seviye Sorular

  1. Entity Framework'te query plan cache nasıl yönetilir?
  2. Cevap:

    • Query plan cache stratejileri
    • Plan cache invalidation
    • Plan cache monitoring
    • Plan cache optimization
    • Plan cache troubleshooting
  3. Entity Framework'te query performansı nasıl optimize edilir?

  4. Cevap:

    • Index kullanımı
    • Query optimizasyonu
    • Caching stratejileri
    • Batch processing
    • Resource yönetimi
  5. Entity Framework'te distributed sistemlerde query yönetimi nasıl yapılır?

  6. Cevap:

    • Query routing
    • Load balancing
    • Data partitioning
    • Replication
    • Consistency
  7. Entity Framework'te high concurrency senaryolarında query yönetimi nasıl yapılır?

  8. Cevap:

    • Optimistic concurrency
    • Pessimistic concurrency
    • Retry mekanizmaları
    • Queue yönetimi
    • Batch processing
  9. Entity Framework'te query monitoring ve profiling nasıl yapılır?

  10. Cevap:
    • Query logging
    • Performance metrics
    • Resource monitoring
    • Profiling tools
    • Health checks