12 Ocak 2009 Pazartesi

Linq Nedir?

Bu makalemizde .NET 3.0 ile hayatımıza girmiş ve verilerimizi hızlı bir biçimde SQL sorguları tarzında sorgulayabileceğimiz yapı olan LINQ (Language Integrated Query)’yu inceleyeceğiz.LINQ syntax olarak SQL anımsatan bir yapıdadır.Sanırım LINQ anlatımın en kolay kolu örnek üzerinde ilerlemek olacaktır. Basit bir örnekle LINQ’nun kullanımını incelemeye başlayalım.

İlk olarak örneğimizde Müşteri adlarını, soyadlarını ve firmalarını tuttuğumuz bir diziyi tanımlayacağız. LINQ’yu kullanacağımız yapının mutlaka IEnumerable interface’ini implement etmesi gerekmektedir. Hangi yapıyı kullanırsak kullanalım bu geçerlidir.

var musteri = new[]{
new{MusteriID=1,Adi="Ali",Soyadi="Kaya",Firma="XYZ Yazılım"},
new{MusteriID=2,Adi="Ahmet",Soyadi="Keskin",Firma="ABC Yazılım"},
new{MusteriID=3,Adi="Mehmet",Soyadi="Güzel",Firma="CAN Bilişim"},
new{MusteriID=4,Adi="Hasan",Soyadi="Kara",Firma="OVS Elektronik"},
new{MusteriID=5,Adi="Ayşe",Soyadi="Polat",Firma="ASD Yazılım"}
};

Daha sonra bu müşterilerimizin firma adlarına göre adreslerini tutan başka bir dizi daha tanımlayalım.

var musteriadres = new[]{
new{Firma="XYZ Yazılım",Ulke="Türkiye",Sehir="İstanbul"},
new{Firma="ABC Yazılım",Ulke="Türkiye",Sehir="Ankara"},
new{Firma="CAN Bilisim",Ulke="İngiltere",Sehir="Londra"},
new{Firma="OVS Elektronik",Ulke="Amerika",Sehir="Seattle"},
new{Firma="ASD Yazılım",Ulke="Rusya",Sehir="Moskova"}
};
Şimdi ilk sorgumuzu yazmaya hazırız.Öncelikle basit olarak müşterilerimizin adlarını döndürecek sorgumuzu yazalım.Daha sonra foreach iterasyonu ile sonuçlar içinde dönerek müşteri adlarını ekrana getirelim.

IEnumerable Adlar = musteri.Select(a => a.Adi);
foreach (string ad in Adlar)
{
Console.WriteLine(ad);
}
Şimdi sonuç ekranına bakalım…


Select metodu diziden isteğimiz veriyi elde etmemize olanak sağlar. Peki, nasıl çalışır? Select metodunun parametresi aslında ilgili diziden bir satır alan ve bu satırdaki seçtiğimiz veriyi geri döndüren bir metottur. Bu görevi tamamlayacak metodu kendimizde yazabilir fakat en basit ve kullanışlı teknik lambda (=>) operatörü yardımıyla anonim bir metot çağırmaktır. Burada bilinmesi gereken Select metodunun parametresinde kullandığımız “a” ifadesi metoda gönderilen parametredir. Bu ifadeyi müşteri dizisi içindeki her satırın takma ismi gibi düşünebilirsiniz. Bu takma ismi yerine tanımlı keywordler dışında istediğiniz ifadeyi kullanabilirsiniz.

Şimdi ilk sorgumuzda ufak bir değişiklik yaparak sadece Türkiye’de bulunan müşterilerimizin firmalarının adlarını getirecek sorgumuzu yazalım.

IEnumerable Musteri = musteriadres.Where(adr => String.Equals(adr.Ulke, "Türkiye")).Select(turk => turk.Firma);
foreach (string Turkmusteri in Musteri)
{
Console.WriteLine(Turkmusteri);
}
İşte sonuç ekranımız…

Sorgumuza dönecek olursak musteriadres isimli dizimizde Where ile String.Equal metodunun da yardımıyla ülkesi Türkiye olan firmaları çekip Select sorgumuzda sadece Firma adlarının çekiyoruz.Daha sonrası zaten bildiğimiz foreach iterasyonundan oluşmaktadır.

Peki,sıralama ve gruplama fonksiyonları LINQ’da nasıl gerçekleştiriliyor?Başta da bahsettiğim gibi LINQ ifadeleri syntax olarak SQL sorgularına çok benzemekte.Dilerseniz örnekler yardımıyla bu ifadelerin de nasıl gerçekleştiğine bir göz atalım.

Firma isimlerini alfabetik sırayla getirmek istersek,

IEnumerable alfabetik=musteri.OrderBy(a=>a.Firma).Select(b=>b.Firma);

İşte sıralama işlemi de bu kadar basit…OrderBy ile neyi sıralayacağımızı lambda operatörü yardımıyla belirlerken ikincisi kısımda artık alışık olduğumuz Select sorgumuzu gerçekleştiriyoruz.

Firmalarımızı ülkelerine göre gruplayarak hangi ülkede kaç firma olduğunu ve bu firmaların hangileri olduğunu getirmek istersek eğer;

var ulkeyegoreFirma = musteriadres.GroupBy(ulkesi => ulkesi.Ulke);
foreach (var Ulkesel in ulkeyegoreFirma)
{
Console.WriteLine("Ulkesi : {0}\t{1}",Ulkesel.Key,Ulkesel.Count());
foreach (var firmalar in Ulkesel)
{
Console.WriteLine("\t{0}",firmalar.Firma);
}
}
Bir de sonucumuza bakalım.

LINQ teknolojisine basit bir bakış olarak değerlendirdiğim bu makalemizde sonra olarak sorgu operatörlerini de nasıl kullanacağımızı da görerek makalemizi sonlandıralım.
Şimdi ilk örnekten beri yapmış olduğumuz tarzda sorgumuzu bir daha yazalım.

IEnumerable musteriilkisimleri=
musteri.Select(a=>a.Adi);
Sıra geldi sorgu operatörleriyle aynı sorguyu tekrar yazmaya…

var musteriilkisimleri=from a in musteri
Select a .Adi
Sizler de fark etmişsinizdir bu tarz sorgular nerdeyse SQL ifadeleriyle aynı.

LINQ dünyasına ufak bir giriş yaptığımız bu makalemizin sonuna geldik. Tabii ki LINQ’nun yetenekleri bunlarla sınırlı değildir. Buraya kadar anlattığımız LINQ ‘nun genel bir tanımı ve LINQ to Object dünyasına genel bir bakış niteliğindedir. Bu makalemizi aynı bu makalemiz gibi basit giriş ve birkaç basit örnek içeren LINQ to SQL ve LINQ to XML makaleleri izleyecektir.Daha sonra ise sırasıyla bu üç konuda da orta ve ileri seviye makaleler yazmayı planlıyorum.

Umarım işinize yarayan bir giriş olmuştur.
Şimdilik Hoşcakalın.

Hiç yorum yok: