Makale Özeti

.NET Framework 3.5 ile beraberinde gelen ve devrim niteliğinde bir yenilik olan LINQ(Language Integrated Query) özelliğimize kısa bir giriş yaparak Dil İle Bütünleştirilmiş Sorgularının gücüne keşfedelim.

Makale

LINQ Nedir?

Microsoft, C# dilinin 2.0 versiyonundan C# 3.0’a yükseltilmesi sürecini LINQ projesi etrafında toplamıştır. Getirilen bütün yenilikler, bu projenin turarlı hale gelmesi için gereken anlamlı parçalardır. Ayrıca yeniliklerin tamamını C# 2.0 ile uyumlu olarak kullanmak mümkündür. Yani C# 3.0, dilin var olan bütün niteliklerini koruyarak belli bir amacı hayata geçirmek için gereken bazı yeni özelliklere ev sahipliği yapmaktadır. Microsoft’un üzerinde çalıştığı bu amaç LINQ projesidir. C# 3.0 ve derleyicisi, birçok dil yeniliği sunar. Bu yenilikler çok farklı alanlarda kullanım kolaylıkları sunmasının yanında Dile Entegre Sorgu (Language Integrated Query - LINQ) yazabilmek için geliştirilmiştir. LINQ projesinin genel amacı, programlama dilinin nesneler ile çalışmadaki esneklik ve kolaylığını, veriler ile çalışma sürecine de sağlamak olarak özetlenebilir. Burada söz konusu veriler, generic koleksiyonlarda saklanan nesnelerin verisi, dataSet içerisinde saklanan veri, çeşitli veri kaynaklarından elde edilen ilişkisel veri, dosya ya da bellek üzerindeki xml veri olabilir. Bu arada projenin sadece C# ile sınırlı kalmayıp Vb.Net ve diğer .Net tabanlı diller için de uygulama alanı bulacağını belirtmekte fayda var...

LINQ projesinin tutarlı hale gelmesi ve programcıların nesnelerle uyumlu şekilde çalışabilmesi için aslında C# 3.0 içerisinde bazı önemli yenilikler getirilmiştir. Bu yeniliklerin asıl amacı LINQ projesine destek vermektir. var tipi, extension method'lar ve object initilazer'lar bu yeniliklerden bir kaçıdır. Bu makalemizde bu yeniliklerden bahsetmekten ziyade, LINQ'i bir projede nasıl etkin olarak kullanabileceğimizi ele almaya çalışacağız. C# 3.0 ile gelen bu yenilikleri incelemek için aşağıdaki linklerde yer alan makalelerden faydalanabilirsiniz.

C# 3.0 Ne Getiriyor ve LINQ Projesi Nedir?
Bilinçsizce Türlendirilmiş Lokal Değişken (Implicitly Typed Local Variable) : var
Nesne ve Koleksiyonlara Ilk Değer Atayıcı (Object and Collection Initializer)
Genişletme Metotları (Extension Methods)

Veri üzerinde sorgularla çalışabilmek programlanılabilirlik açısından büyük önem taşımaktadır. Bunun üzerine LINQ geliştirilerek bizlere sunuldu ve LINQ ile kodlarımızla doğrudan veriye sorgular yazarak veriden istediğimiz sonuçları almamızı sağlıyor. Durum itibariyle böyle olunca yazılımcılara büyük bir kolaylık sağlanmış olmakla beraber, Performans artışı da sağlıyor.

Artık Basit Örneklerle Giriş Yapalım;


Global Değişkenlerimiz:



Açıklama:

Global değişkenlerimizi, örneklerde linq teknolojisini daha iyi anlaşılır hale getirmek için sabit kullanmak istedim. Dolayısıyla ortak bir alanda global olarak tanımladım.



Kod (Örnek 1):


Çıktı:

Açıklama:

İlk örneğimizde Bilinçsizce türlendirilmiş yerel değişkenimiz olan var tipi sizlere yabancı bir nesne olarak gelebilir. Örneklemek gerekirse, JavaScript kullananlar bilirlerki bilinçsizce türlendirilmiş değişkenlerimize istediğimiz bir tipin değerini atayabiliriz. Mesela, 123 gibi tam sayı verirsek int tipinde değer almış olur, 'abc' dersek char tipinde değer almış olur, "abc" dersek string tipinde değer almış olur, true|false dersek bool tipinde değer almış olur vs.... Daha önce var değişkenini bilmeyenler için kısa bir açıklama yaptım. Umarım çabuk ısınırsınız...

Örneğimizi açıklamak gerekirse,
bilinçsizce türlendirilmiş var tipinde islem adında bir değişken tanımladık ve değerine Sql'cilere tanıdık gelen bir yazım ifadesi yazdık.
from s in Sayilar // s burada geçici bir ön değişkenimiz ve Sayilar dizimizi s değişkenimize bildiriyoruz
select s // bu kısımda ise geçici ön değişkenimiz olan s değişkenimizin içindekileri seçiyoruz.

ve sizinde tahmin ettiğiniz gibi Sayilar dizimizde ne varsa hepsini ekrana teker teker yazdırıyoruz.
küçük bir hatırlatma HTML ifadelerinde <br> tagları bir alt satıra geçmek için kullanılır..



Kod(Örnek 2):

Çıktı:

Açıklama:

Artık bilinçsizce türlendirilmiş var tipimizi biliyorsunuz, Global değişkenlerimizide gördünüz ve hemen hemen tüm örneklerde aynı adımlar var o yüzden oluşturduğumuz değişkenleri tek tek bahsetmek yerine linq teknolojisi adına gelen yeni yazım türlerinden bahsedeceğim...

Biliyorum aynı sql gibi olmuş diyorsunuz, eğer öyle diyorsanız daha çok diyeceksiniz :)
bu örneğimizde Sayilar dizimizi ele aldık ve bir koşul(where) koyduk, koşulumuz herkesin görebildiği gibi 5 sayısına eşit yada büyük olan tüm sayıları getir dedik, getir dedik ama bide sıralama yap demişiz ne kadar kolay görüyorsunuz dimi :) Çoktan aza doğru (descending) sıralama (orderby) yaparak ekrana sonucu yazdırdık..



Kod(Örnek 3):

Çıktı:

Açıklama:

Bir önceki örneğimizden pek bir farkı yok. Sadece descending (çok aza) yerine ascending(azdan çoğa) olarak sıralama yaptık..



Kod(Örnek 4):

Çıktı:

Açıklama:

Sehirler dizimize bakarsanız birbirini tekrar eden şehirler olmasına rağmen Distinct() methodunu kullanarak tekrarlamadan tüm şehirlerimizi getirdik ve ekrana yazdırdık...



Biraz daha ileri seviyeye giderek XML verisi işleyeme ne dersiniz. XML örneğimizde TCMB'na bağlanarak Kur bilgilerini alalım. Öncelikle TCMB'dan alacağımız kur bilgileri için XML adresi: http://www.tcmb.gov.tr/kurlar/today.xml

XML içerisine girip bakacak olursak aşağıdaki gibi düzenli olarak her para birimi için <Currency>..</Currency> tagları arasında, xml kodları göreceksiniz (Örnekteki USD para birim içindir, bazı para birimlerinde aşağıdaki elementlerden bazıları bulunmamaktadır, Dolayısıyla Örneğimizdeki bazı para birimleri için References hatası almamız normal olacaktır.).:

XML örneğimizi biraz daha kompleks hale getirerek bir tane dropdownlist nesnesi ekleyelim ve items(elemanlarına) TCMB'dan aldığımız tüm kur bilgilerinin Isim elementlerini ekleyelim.

oluşturduğumuz methodu sayfmızın Page_Load olayına ekleyelim.

Aşağıdaki resimde gördüğünüz gibi, sayfamız yüklendiğinde tüm Kur isimlerini dropdownlist nesnemizde yüklü bir şekilde görebiliyoruz.

Dropdownlist nesnemize elemanları eklerken sıralı bir şekilde eklenmesini istersek,
ddl_Doldur() methodumuzda bilinçsizce türlendirilmiş islem değişkenimize, hemen select ifadesinden önce;
"orderby k.Element("Isim").Value" ifadesini eklersek default olarak ascending olarak sıralanır.

Şimdi örneğimizin asıl yerine gelelim.Dropdownlist nesnemizde seçili olan Kur adının, kur bilgilerini getirelim..

Kod(Örnek 5):

çıktı almadan önce dropdownlist nesnemizde STERLİN elemanını seçtim.


Çıktı:


Açıklama:

Burada ilk önce sorulacak soru XDocument nesnesi nedir? İlk aşamada XDocument nesnesi XML dökümanı içermekle sorumlu olduğunu bilmeniz yeterli olacaktır. Daha önce XML verileriyle hiç uğraşmamışsanız bu örneği anlamanız biraz zaman alabilir. XML verisi ile daha önce uğraşanlar ise Kod kısmını inceleyerek ne yaptığımızı kolayca anlayabilirler. burada sadece where koşuluna bakmanızı istiyorum. Dikkat ederseniz Isim elementinin dropdownlist nesnemizde secili olan elemanın textine eşit olan kurun, kur bilgilerini getiriyoruz...



Kod(Örnek 6):

Çıktı:

Açıklama:

Count() methoduyla toplamda kaç tane Kur bilgileri var, Onu Saydık.



Kod(Örnek 8):

Çıktı:

Açıklama:

Distinct() Methodu ve Count() methodunu kullanarak toplamda Kaç Tekil Şehir Adı var onu saydık ve getirdik.



Kod(Örnek 9):

Çıktı:

Açıklama:

Sum() methoduyla Sayilar dizimizin elemanlarının toplamını getirdik.



Kod(Örnek 10):

Çıktı:

Açıklama:

Min() methoduyla, Sayilar dizimizdeki en küçük sayıyı getirdik...



Kod(Örnek 11):

Çıktı:

Açıklama:

Max() methoduyla Sayilar dizimizdeki en büyük sayıyı getirdik..



Kod(Örnek 12):

Çıktı:

Açıklama:

Max() methoduna bir takım parametreler gönderek, Sehirler dizimizdeki, en uzun karakterli şehrin uzunluğunu getirdik.



Kod(Örnek 13):

Çıktı:

Açıklama:

Average() Methoduyla Sayilar dizisindeki sayiların ortalamasını getirdik



Kod(Örnek 14):

Çıktı:

Açıklama:

Concat() methoduyla Sayilar dizimizi ve Sayilar2 dizimizi birleştirerek getirdik..



Kod(Örnek 15):

Çıktı:

Açıklama:

Any() Methoduyla, Contains() parametresinin içerisinde girdiğimiz stringi, Sehirler dizimizin tüm elemanlarına bakarak, eğer dizi içinde bulursa true bulumazsa false değeri dönderir.



Kod(Örnek 16):

Çıktı:

Açıklama:

First() methoduyla Sehirler dizimizdeki ilk elemanı getirdik...



Kod(Örnek 17):

Çıktı:

Açıklama:

Intersect() methoduyla iki dizi arasında çakışan elemanları getirdik..



Kod(Örnek 18):

Çıktı:

Açıklama:

Take() methodunun parametresine 5 gönderek, Sayilar dizimizin ilk 5 elemanını getirdik...



Kod(Örnek 19):

Çıktı:

Açıklama:

Skip() methodunun parametresine 5 gönderek, Sayilar dizimizin ilk 5 elemanından sonraki elemanları getirdik...

 

Bu makalemizde giriş seviyesinde Linq ile bir çok yeni sorgulama ve yeni yazım ifadelerini tanımış olduk.

Çalışma projesini yukarıdaki Download linkinden indirebilirsiniz.

Bir sonraki makalede görüşmek dileğiyle..

Serkan PEKTAŞ