C#.NET LINQ’e Giriş ve LINQ to Object
LINQ (Language Integrated Query) Dile Entegre Edilmiş Sorgu Yapısı
LINQ C# 3.0 daki en önemli yeniliktir.Linq C# programlama dili ile herhangi bir ara bileşene ihtiyaç duymadan dilin kendi söz dizimi ile veriye erişimi ve veri üzerindeki işlemleri kolaylaştırmak için ortaya çıkmış yeni C# teknolojisidir.
Kısacası linq veriler üzerinde sorgulama yapabilmemizi sağlayan kod yapısıdır.
Bu veri XML olabilir veritabanındaki herhangi bir veri olabilir ya da başka bir liste olabilir. .NET Framework 3.5 ile birlikte bu veri kaynaklarından 3 tanesi varsayılan olarak desteklenmektedir bunlar ;
1) Linq To Object : Hafızada bulunan List gibi koleksyon yapılarının sorgulanması ve işlenmesi amacı ile geliştirilmiştir.
2) Linq To Sql : SQL server gibi ilişkisel veri formatlarında veriyi tutan ortamlardaki verilere erişmek ve o veriler üzerinde işlem yapmak için kullanabileceğimiz bir LINQ sağlayıcısıdır.
3) Linq To Xml : XML veri kaynaklarına herhangi bir ayıklayıcı kullanmadan hızlı bir şekilde erişmek için kullanılmakta.
LINQ’e kısa bir girişten sonra linq’in ortaya çıkış sebebi hakkında birkaç kısa bilgi verelim.Hiç şüphesiz programlamada veritabanlarının yeri çok önemlidir ,hemen hemen herkes veritabanı kullandığı projeler yapmış ya da yapmaktadır.İşte Microsoft bu büyük yazılımcı kitlesinin işini kolaylaştırmak için böyle bir teknolojiyi bizlere sunmuştur.Bu teknolojiyle uzun ve yorucu kodlardan kurtuluyoruz bu aynı zamanda hata oranınıda minumuma indiriyor.Normal yollardan yazacağımız kodları linq kullanarak bir kaç satırda halledebiliriz.
Şimdide basit bir örnek yapalım örneğimizde bir diziden istediğimiz değerleri çekelim öncelikle formumuzun üzerine bir adet buton bir adette listbox ekleyelim daha sonra butınumuzun içerisine bir dizi tanımlayarak ilk değerler verelim ve linq kullanarak bu diziden 3′e bölünebilenleri listbox’a atalım
private void button1_Click(object sender, EventArgs e)
{
int[] dizi=new int[]{12,23,45,56,34,54,44,67,14,25,68};
var ucebolunen = from sayi in dizi
where sayi % 3 == 0
select sayi;
foreach(var deger in ucebolunen)
{
listBox1.Items.Add(deger);
}
}
Görmüş olduğunuz gibi normal yollardanda yapabileceğimiz bir örneği linq sayesinde çok daha kolay ve anlaşılır bir şekilde yaptık.
Konunun daha iyi anlaşılabilmesi için bir örnek daha yapalım bu örneğimizde de dizideki sayıların değerlerinin 3 katını listbox’a yazdıralım.
private void button1_Click(object sender, EventArgs e)
{
int[] dizi=new int[]{12,23,45,56,34,54,44,67,14,25,68};
var ucebolunen = from sayi in dizi
select sayi*3;
foreach(var deger in ucebolunen)
{
listBox1.Items.Add(deger);
}
}
Burada where komutunu kullanmadık çünkü çekmek istediğimiz kısıtlı veri yok tüm veriler üzerinden işlem yapacaktık tüm verileri 3 ile çarpacaktık.
Şimdi ise daha güzel bir örnek yaparak öğrendiklerimizi dahada pekiştirelim.Bu örneğimizde de bir şehirler dizisi oluşturacağız ve bu şehirler dizisinden baş harfi g olanları çekeceğiz listbox’a yazdıracağız.
private void button2_Click(object sender, EventArgs e)
{
string[] sehirler = new string[] {"gaziantep","kahramanmaraş","mersin","istanbul","giresun","gümüşhane" };
var ara = from sehir in sehirler
where sehir[0]=='g'
select sehir;
foreach (var aranansehir in ara)
{
listBox1.Items.Add(aranansehir);
}
}
Şimdide örneğimizde farklı bir komut kullanalım bu örneğimizde ise bir başka string dizini sehirler dizisiyle birleştirerek ikisinin içeresinde baş harfleri aynı olanları çekeceğiz bu örneğimizlede join kullanımını öğreneceğiz bu şekilde istediğimiz kadar diziyi birleştirebileceğimizide belirttikten sonra örneğimize geçelim.
private void button2_Click(object sender, EventArgs e)
{
string[] sehirler = new string[] { "gaziantep", "gümüşhane", "mersin", "istanbul", "elazığ", "kahramanmaraş" };
string[] sehirler2 = new string[] {"kayseri","malatya","izmir","erzurum","antalya","yozgat" };
var ara = from sehir in sehirler
join sehir2 in sehirler2 on sehir[0] equals sehir2[0]
select sehir+" "+sehir2;
foreach (var aranansehir in ara)
{
listBox1.Items.Add(aranansehir);
}
}
Burada baş harfleri aynı olana şehirleri aralarında bir boşluk bırakarak listbox’a yazıyoruz.
Şimdide bazılarını örneklerde de kullandığımız linq metotlarını ve ne işe yaradığı hakkında kısa açıklamalar yapalım.
1) Where : Kısıtlama Operatörleri (Restriction Operators)
2) Select : İzdüşüm Operatörleri (Projection Operators)
3) Group : Gruplama Operatörleri (Grouping Operators)
4) OrderBy , ThenBy , Reverse : Sıralama Operatörleri (Ordering Operators)
5) Take , Skip , TakeWhile , SkipWhile : Bölümleme Operatörleri (Partitioning Operators)
6) ToArray , ToList , ToDictionary , OfType : Dönüştürme Operatörleri (Conversion Operators)
7) Distinct , Union , Intersect , Except : Küme Operatörleri (Set Operators)
8 ) Count , Sum , Min , Max , Average , Fold : Grup Operatörleri (Aggregate Operators)
9) Any , All : Ölçüm Operatörleri (Quantifiers Operators)
10) First , FirstOrDefault , ElementAt : Eleman Operatörleri (Element Operators)
Şimdide bunların bazılarıyla ilgili örnekler yapalım.İlk örneğimiz bölümleme (Take) operatörünün kullanmı ile olacak.Bu örneğimizde daha önce yapmış olduğumuz örnek üzerinde bazı oynamalar yapacağız örneğimizde içerisine birkaç tane sayı eklediğimiz dizimizden veri çekeceğiz ancak sayıların tamamını değil belirlediğimiz kadarını çekeceğiz.
private void button1_Click(object sender, EventArgs e)
{
int[] dizi=new int[]{12,23,45,56,34,54,44,67,14,25,68};
var sayialar = (from sayi in dizi
select sayi).Take(3);
foreach(var deger in sayialar)
{
listBox1.Items.Add(deger);
}
}
Take(3) kodu dikkatinizi çekmiştir bu kod gelen verilerin ilk 3 tanesinin eklenmesini sağlıyor çalıştırdığımızda 12,23 ve 45 sayıları gelecektir.
Sıradaki örneğimizde yine bölümleme operatörlerinden Skip operatörünü kullanacağız.Buradaki amacımız ise yine yukarıdaki diziden sayılar çekeceğiz ancak burada farklı olarak belirlediğimiz sayı kadarını atlatacak olmamızdır kafanız karışmış olabilir örneğimizde gördüğünüzde daha iyi anlayacağınıza eminim.
private void button1_Click(object sender, EventArgs e)
{
int[] dizi=new int[]{12,23,45,56,34,54,44,67,14,25,68};
var sayialar = (from sayi in dizi
select sayi).Skip(3);
foreach(var deger in sayialar)
{
listBox1.Items.Add(deger);
}
}
Yukardaki kodları çalıştırdığınıza listbox’a 56′dan başlayarak sayıları ekleyecek ancak 12,23 ve 45′i listbox’a eklemeyecek.İşte Skip(3) dediğimizde ilk üç veriyi pas geçiyor ondan sonrakileri ekliyor.
Sıradaki örneğimizde ise sıralama operatörü olan orderby operatörünü kullanalım .Yine bu örneğimizde de içerisinde sayıların bulunduğu dizimizi kullanalım ve sayılarımızı küçükten büyüğe sıralayalım.
private void button1_Click(object sender, EventArgs e)
{
int[] dizi=new int[]{12,23,45,56,34,54,44,67,14,25,68};
var sayialar = (from sayi in dizi
orderby sayi
select sayi);
foreach(var deger in sayialar)
{
listBox1.Items.Add(deger);
}
}
Çalıştırdığımızda sayıları küçükten büyüğe doğru alt alta yazdıracaktır.Burada bir önemli noktaya değinelim eğer sıralamayı tersten yani büyükten küçüğe doğru sıralatmak istiyorsanız orderby satırını aşağıdaki gibi değiştirin
orderby sayi descending
Sıradaki örneğimizdede küme operatörlerinden Distinct() operatörünü öğreneceğiz bu operatör tekrarlanan verileri bir veriye indirgiyor.Yani dizimizin içerisine 4 tane 23 sayısı yazalım Distinct() operatörü kullandığımızda bir tane 23 sayısı eklenecektir.Şimdide bunu örnek üzerinde görelim.
private void button1_Click(object sender, EventArgs e)
{
int[] dizi=new int[]{12,23,23,23,23,45,56,34,54,44,67,14,25,68};
var sayialar = (from sayi in dizi
select sayi).Distinct();
foreach(var deger in sayialar)
{
listBox1.Items.Add(deger);
}
}
Çalıştırdığımızda 12,23,45,56 … şeklinde devam eden bir çıktı alacağız.
Ve son olarakta Concat operatörünü kullanacağız bu operatörün görevi ise iki grubu birleştirmektir bu örneğimizde iki farklı diziyi birleştirerek bir diziymiş gibi iki dizininde verilerini çekeceğiz.
private void button1_Click(object sender, EventArgs e)
{
int[] dizi=new int[]{12,23,45,56,34,54,44,67,14,25,68};
int[] dizi2 = new int[] {1,2,3,4 };
var sonuc = dizi2.Concat(dizi);
sonuc = (from sayi in sonuc
select sayi);
foreach(var deger in sonuc)
{
listBox1.Items.Add(deger);
}
}
Böylelikle LİNQ to Object konumuzun sonuna gelmiş bulunmaktayız dilerim faydalı olmuştur.Bir sonraki makalemiz olan LINQ to SQL dersimizde görüşmek dileğiyle.