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<T> 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üşha
ne" };
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.
Örneklerden sonrada bazılarını örneklerde 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 makalemizde LINQ
to SQL konusunu işleyeceğiz.
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<T> 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.