LINQ (Language Integrated Query) MySQL'e oldukça benzer ancak MySql veritabanları ile çalışırken LINQ koleksiyonlar ile çalışır. C# programlama dili konusunda oldukça kapsamlı bir yazı hazırlamıştım (C# Programlama Dili Hakkında Her Şey) ama İleri C# konularını eklemeye zamanım yetmemişti. Bugün LINQ'e giriş ve örnekler ile bu çalışmaya da başlamış olalım.
LINQ ile yazılan sorguları üç adımda düşünebiliriz:
1. Kaynağı almak
2. Sorguyu (Query) yazmak
3. Sorguyu çalıştırmak
Veritabanı ile Select sorguları yazanlara LINQ sorguları başlangıçta ters gelir çünkü Syntax'ı veritabanı sorgularının aşağı yukarı tam tersidir. Temel bir LINQ sorgusu şu şekilde yazılır.
1. Kaynağın belirtilmesi: from ... in ...
2. Şartların belirtilmesi: where ...
3. Filtelenmiş çıktıyı almak: select ...
C# ve Dizi İçerisinde LINQ Sorguları Yapmak
Tamsayılardan oluşan bir dizi tanımlayalım ve LINQ sorguları ile dizi içerisindeki elemanları filtreleyerek yazdıralım.
int[] sayilar = { 25, 33, 1, 962, 8, 254, 25, 41, 99, 3 };
Örnek 1: sayilar dizisinde 2'ye kalansız olarak bölünebilen sayıları (çift sayıları) LINQ ile seçerek yazdırın.
var ciftSayilar = from sayi in sayilar
where sayi % 2 == 0
select sayi;
Console.WriteLine(string.Join(", ", ciftSayilar)); //962, 8, 254
Örnek 2: 2'den büyük ve 10'dan küçük sayıları LINQ ile seçerek yazdırın.
var sayilar2ile10 = from sayi in sayilar
where (sayi > 2) && (sayi < 10)
select sayi;
Console.WriteLine(string.Join(", ", sayilar2ile10)); //8,3
LINQ içerisinde birden çok şart belirtildiğinde where ifadeleri çoğaltılarak da yazım sağlanabilir. Üstteki kod ile aşağıdaki çift where'li kod aynı işlevi görmektedir. Kullanıcı istediği seçimi yapabilir.
var sayilar5ile10Alternatif = from sayi in sayilar
where sayi > 2
where sayi < 10
select sayi;
Console.WriteLine(string.Join(", ", sayilar5ile10Alternatif)); //8,3
Örnek 3: sayılar dizisindeki tamsayılardan 2 ile 10 arasındaki değerleri seçerek artan sırada yazdırın.
Not: orderby ifadesi ile sıralanmak istenen alan seçilebilir. Varsayılan (default) sıralama seçeneği artan (ascending) olduğu için yazılması şart değildir. Azalan sırada seçim yapılası istenirse de descending anahtar kelimesi yazılmalıdır. İlerleyen örneklerde de göreceğimiz gibi birden çok alana göre de sıralama yapmak mümkündür.
var sayilar5ile10Sirali = from sayi in sayilar
where sayi > 2
where sayi < 10
orderby sayi //ascending
select sayi;
Console.WriteLine(string.Join(", ", sayilar5ile10Sirali)); //3,8
Şimdi de string'lerden oluşan bir dizi tanımlayalım ve örnekleri inceleyelim.
string[] takimlar = { "Galatasaray", "Fenerbahçe", "Beşiktaş", "Trabzonspor", "Bursaspor", "Cizrespor" };
Örnek 4: Futbol takımlarından oluşan takimlar dizisi içerisinde içinde a harfi geçen takımları LINQ ile bularak yazdırın.
var aHarfliTakimlar = from takim in takimlar
where takim.Contains("a")
select takim;
Console.WriteLine(string.Join(", ", aHarfliTakimlar));
//Galatasaray, Fenerbahçe, Besiktas, Trabzonspor, Bursaspor
Örnek 5: takimlar dizisi içindeki string elemanlardan içinde a harfi olanları ve (aynı anda) 9 karakter uzunluğunda olanları LINQ ile seçerek listeleyin.
var aHarfli9KarakterliTakimlar = from takim in takimlar
where takim.Contains("a") && takim.Length.Equals(9)
select takim;
Console.WriteLine(string.Join(", ", aHarfli9KarakterliTakimlar));
//Bursaspor