Skip to content

LINQ: C#'ın Query Süper Gücü

Published: at 11:00 PMSuggest an edit

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:

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

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.



Previous Post
WaveNet: Ses Dalgalarını Bit Bit Üretmek
Next Post
UFW (Uncomplicated Firewall): Linux Firewall Yönetimi Rehberi