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¶
- Performans
- Daha verimli sorgular
- Daha az veritabanı yükü
- Daha iyi sorgu planları
-
Daha hızlı yanıt süreleri
-
Esneklik
- Karmaşık sorgular
- Dinamik sorgular
- Özelleştirilmiş sorgular
-
Verimli veri filtreleme
-
Bakım
- Daha temiz kod
- Daha kolay debug
- Daha iyi test edilebilirlik
- Daha kolay bakım
Advanced Querying Teknikleri¶
-
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();
-
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();
-
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));
-
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); }
-
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¶
- Query Tasarımı
- Eager loading kullanımı
- Projection kullanımı
- Compiled query kullanımı
- Batch processing
-
Pagination
-
Performans
- Index kullanımı
- Query optimizasyonu
- Caching stratejileri
- Batch processing
-
Resource yönetimi
-
Güvenlik
- SQL injection önleme
- Parametre kullanımı
- Input validation
- Access control
-
Audit logging
-
Bakım
- Kod organizasyonu
- Documentation
- Testing
- Version control
- Error handling
Mülakat Soruları¶
Temel Sorular¶
- Entity Framework'te LINQ to Entities nedir?
-
Cevap: LINQ to Entities, Entity Framework'te veritabanı sorgularını nesne yönelimli bir şekilde yazmayı sağlayan bir teknolojidir.
-
Entity Framework'te raw SQL sorguları ne zaman kullanılır?
-
Cevap: Karmaşık sorgular, stored procedure'ler, view'lar veya performans gerektiren durumlarda kullanılır.
-
Entity Framework'te compiled query nedir?
-
Cevap: Compiled query, sorgunun bir kez derlenip tekrar tekrar kullanılmasını sağlayan bir optimizasyon tekniğidir.
-
Entity Framework'te dynamic query nedir?
-
Cevap: Runtime'da oluşturulan ve değişen sorgulardır. Expression'lar veya IQueryable kullanılarak oluşturulur.
-
Entity Framework'te complex query nedir?
- Cevap: Subquery, join, union gibi karmaşık veritabanı işlemlerini içeren sorgulardır.
Teknik Sorular¶
- LINQ to Entities ile nasıl karmaşık sorgu yazılır?
-
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();
-
Raw SQL sorguları nasıl yazılır?
-
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();
-
Compiled query nasıl oluşturulur?
-
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);
-
Dynamic query nasıl oluşturulur?
-
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; }
-
Complex query nasıl yazılır?
- 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¶
- Entity Framework'te query plan cache nasıl yönetilir?
-
Cevap:
- Query plan cache stratejileri
- Plan cache invalidation
- Plan cache monitoring
- Plan cache optimization
- Plan cache troubleshooting
-
Entity Framework'te query performansı nasıl optimize edilir?
-
Cevap:
- Index kullanımı
- Query optimizasyonu
- Caching stratejileri
- Batch processing
- Resource yönetimi
-
Entity Framework'te distributed sistemlerde query yönetimi nasıl yapılır?
-
Cevap:
- Query routing
- Load balancing
- Data partitioning
- Replication
- Consistency
-
Entity Framework'te high concurrency senaryolarında query yönetimi nasıl yapılır?
-
Cevap:
- Optimistic concurrency
- Pessimistic concurrency
- Retry mekanizmaları
- Queue yönetimi
- Batch processing
-
Entity Framework'te query monitoring ve profiling nasıl yapılır?
- Cevap:
- Query logging
- Performance metrics
- Resource monitoring
- Profiling tools
- Health checks