Merhaba arkadaşlar! Bugün C# dünyasının belki de en güzel özelliklerinden birini konuşacağız: LINQ (Language Integrated Query). 2007’de C# 3.0 ile hayatımıza giren LINQ, veri sorgulama ve manipülasyonu tamamen değiştirdi. SQL’i C# kodunun içine entegre etmek gibi düşünün - ama çok daha fazlası!
LINQ Nedir? Problem Ne?
Eskiden collection’larla çalışmak işkenceydi arkadaşlar. Nested for loop’lar, if statement’lar, temporary list’ler… Basit bir “18 yaşından büyük kullanıcıları bul ve isimlerine göre sırala” işlemi bile onlarca satır kod gerektiriyordu.
LINQ bu problemi çözüyor. Declarative bir yaklaşımla, ne istediğinizi söylüyorsunuz, nasıl yapılacağıyla uğraşmıyorsunuz. SQL yazmışlığınız varsa, mantık çok tanıdık gelecek. Ama LINQ sadece database query’si değil - array’ler, list’ler, XML, JSON, hatta custom object’ler üzerinde çalışıyor!
İki Farklı Syntax: Query vs Method
LINQ’nun iki farklı yazım şekli var ve ikisi de aynı işi yapıyor:
Query Syntax: SQL’e benzer, daha okunabilir Method Syntax: Functional programming tarzı, daha güçlü ve esnek
Hangisini kullanacağınız tamamen tercihinize bağlı. Çoğu developer method syntax’ı tercih ediyor çünkü daha fazla özellik sunuyor ve IntelliSense desteği daha iyi.
LINQ’nun Gücü: Deferred Execution
LINQ’nun en önemli özelliklerinden biri deferred execution (ertelenmiş çalıştırma). Query’nizi tanımladığınızda hemen çalışmaz! Sadece sonuca gerçekten ihtiyacınız olduğunda (ToList(), FirstOrDefault(), Count() gibi) çalışır.
Bu ne demek? Query’yi bir kere tanımlayıp, farklı zamanlarda farklı sonuçlar alabilirsiniz. Veri değiştiyse, query otomatik olarak yeni veriyle çalışır. Performans açısından da harika - gereksiz işlem yapmıyorsunuz.
LINQ Providers - Her Yerde LINQ
LINQ’nun sihri provider’larında. Farklı veri kaynaklarıyla çalışmak için farklı provider’lar var:
- LINQ to Objects: Memory’deki collection’lar için (List, Array, Dictionary…)
- LINQ to SQL: SQL Server database’leri için
- LINQ to Entities: Entity Framework ile tüm database’ler için
- LINQ to XML: XML verisi için
- LINQ to JSON: JSON verisi için (Newtonsoft.Json ile)
- Parallel LINQ (PLINQ): Multi-core processing için
En güzeli? Aynı syntax’ı hepsiyle kullanıyorsunuz!
Basit Örnekler
// Sample data
var products = new List<Product>
{
new Product { Id = 1, Name = "Laptop", Price = 1000, Category = "Electronics" },
new Product { Id = 2, Name = "Mouse", Price = 20, Category = "Electronics" },
new Product { Id = 3, Name = "Book", Price = 15, Category = "Education" }
};
// Method syntax - Filter and project
var expensiveItems = products
.Where(p => p.Price > 50)
.Select(p => new { p.Name, p.Price })
.OrderByDescending(p => p.Price);
// Query syntax - Same result
var expensiveItemsQuery =
from p in products
where p.Price > 50
orderby p.Price descending
select new { p.Name, p.Price };
// Grouping example
var productsByCategory = products
.GroupBy(p => p.Category)
.Select(g => new
{
Category = g.Key,
Count = g.Count(),
TotalValue = g.Sum(p => p.Price)
});
Method Chaining - LINQ’nun Güzelliği
LINQ method’ları chainlenebilir. Bu fluent interface sayesinde kompleks query’leri okunabilir şekilde yazabiliyorsunuz:
var result = customers
.Where(c => c.Age > 18) // Filter adults
.OrderBy(c => c.LastName) // Sort by last name
.ThenBy(c => c.FirstName) // Then by first name
.Skip(10) // Skip first 10
.Take(20) // Take next 20
.Select(c => c.Email) // Get only emails
.Distinct() // Remove duplicates
.ToList(); // Execute and materialize
LINQ vs SQL
LINQ SQL’den ilham almış ama farklılıklar var:
Type Safety: LINQ compile-time type checking yapıyor. SQL syntax error’ları runtime’da çıkar.
IntelliSense: IDE size yardım ediyor. Property isimleri, method’lar otomatik tamamlanıyor.
Refactoring: Property ismi değişince, LINQ query’leri otomatik güncelleniyor.
Debugging: LINQ query’lerini debug edebilirsiniz. Breakpoint koyup, step-by-step ilerleyebilirsiniz.
Anonymous Types ve Projection
LINQ’nun harika özelliklerinden biri anonymous type’lar. Query sonucunda yeni tipler oluşturabiliyorsunuz:
// Create new shape without defining a class
var summary = orders
.Select(o => new
{
o.CustomerId,
o.OrderDate,
Year = o.OrderDate.Year,
Total = o.OrderItems.Sum(i => i.Price * i.Quantity)
});
Real World Kullanım
- Data Processing: CSV/Excel dosyalarını parse edip, filtreleyip, gruplama
- API Response Handling: JSON response’ları transform etme
- Report Generation: Complex business logic ile rapor üretme
- Testing: Test data’sını query’leme ve assertion
- Configuration: Config dosyalarını okuma ve validation
Sonuç
LINQ, C# developer’ının olmazsa olmazı. Veri manipülasyonunu o kadar kolaylaştırıyor ki, bir kere öğrenince onsuz kod yazmak istemiyorsunuz. SQL bilgisi olanlar için learning curve düşük, ama gücü muazzam.
En güzel yanı? Her yerde kullanabiliyorsunuz. Database query’lerinden, in-memory collection’lara, XML’den JSON’a… Aynı syntax, aynı pattern’ler.