Koca bir INETA NEXT serisi bitti! :) Bu hafta sonu gerçekleştirdiğimiz
Denizli etkinliği ile beraber 2009'ın NEXT serisine son vermiş olduk.
Diyarbakır, İstanbul, Kayseri ve Denizli turumuz INETA kapsamında tüm sosyal
topluluklar ve editörleri ile beraber son iki yılda gerçekleştirdiğimiz en büyük
hareket oldu. Tüm bu seri boyunca katkıda bulunan INETA sosyal topluluklarımıza
ve sevgili konuşmacılarımıza ÇOK teşekkürler.
Muammer Benzeş (birliktegelistir.com)
Erkan Balaban (Ceviz.net)
Oğuz Yağmur (csharpnedir.com)
Uğur Umutluoğlu (nedirtv.com)
Barış Kanlıca (yazgelistir.com)
Burak Selim Şenyurt (nedirtv.com)
Selçuk Yavuz (Ceviz.net)
Tüm etkinlikler boyunca en çok merak edilenlerden birinin "Beyin" olduğunu
gördüm :) Biliyorsunuz ilk etkinliği duyurduğumuzda her şehirde bir katılımcıya
yeni bir beyin vereceğimizden bahsetmiştik. Bu beyin konusunda ben her ne kadar
samimi olsam da :) herkes "beyin" kelimesinden yola çıkarak çok farklı şeyler
düşünmüş. Oysa gerçekten de "beyin" derken "beyin" demek istemiştim :)
 Yepyeni bir beynin sahibi!
Fotoğrafta da görebileceğiniz üzere arkadaşımız yeni beynini sevinçle
karşılamış durumda :D Her şehirde bu şekilde bir beyin hediye etme şansımız
oldu. Beynin özelliği gerçek bir beyin "vıcıklığında" olma ile beraber her ne
yaparsanız yapın esnese de şeklini kaybetmiyor olması :)

Etkinliklerimize katılan herkese tekrar defalarca çok teşekkürler. Bizi takip
etmeye devam edin ;)
Bugün Samsun 19 Mayıs Üniversitesi'ndeydim. Bilişim günleri etkinliğinin
ikinci gününde Silverligjt, WPF ve LINQ üzerine oturumlarım oldu. Uzun süredir
Samsun'da bu gibi bir aktivitenin yapılmamış olduğu bilgisini öğrencilerden
alırken aslında ben de çaktırmadan ilk Samsun ziyaretimi yapmış oldum. Kimse
üstüne alınmazım ama :) deniz kenarı sevdam doğduğum şehir İstanbul'dan
kaynaklanıyor olsa gerek.
 19 Mayıs Üniversitesi Bilişim Kulübü ile hatıra fotoğrafı.
Etkinliğe tahmin ettiğimin üzerinde bir katılım oldu. Sonrasında tam günlük
seminer serisine dayanamayanlar da olmadı değil :) Hatta aldığım duyumlara göre
ben varmadan önce "O kadar saat nasıl anlatacak" şeklinde sorular geziyormuş
kulaktan kulağa :) Belli ki beni tanımıyorlar :) Şaka bir yana özellikle
etkinlikte organizason için tüm Bilişim Kulübü'ne, hocalarımıza ve sevgili
MSP Hacer Kübra Köse'ye çok teşekkür ediyorum. Benim için büyük
bir zevkti. Umarım herkes için faydalı bir gün olmuştur.
Bu hafta sonu epey yoğun bir tempo ile Ankara'da Bilkent Üniversitesi'ndeki
iki etkinlik ve Çankaya Üniversitesi'ndeki bir etkinlik
arasında gidip geldim :) Tüm bu tempo içerisinde XLINQ konusundan bahsettiğim
her dakikada VB'nin Inline XML özelliğine hayran kalmayan kalmadı diyebilirim :)
Ama gelin C#'cılar için de faydalı olabilecek bir ipucunu sizlerle paylaşiyim.
WCF Rest Starter Kit Preview 2
Aslında sizlere anlatacağım işlevsellik Rest based servislerin kullanımı için
hazırlanmış. İsterseniz bu çerçevede aşağıdan download edebileceğiniz paketi
bilgisayarınıa yükleyip diğer özellikleri de inceleyebilirsiniz. Fakat bizim bu
yazımızda odaklanacağımız nokta C# ile XML sorgulama ve hızlıca XML yaratma
konuları olacak.
http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24644
Özünde bugün rahatlıkla C# ile XML sorgulayabilir veya yaratabilirsiniz fakat
elinizde hazır bir XML kodu olduğunu düşünürsek bu kodu yaratacak veya okuyacak
C# kodunu yazarken sürekli hedef XML'in yapısını incelemek zorunda kalıyoruz.
VB'de Inline XML bu sorunu tamamen çözse de C# içerisinde ancak WCF Rest Starter
Kit ile beraber gelen araçları kullanarak işimizi kolaylaştırabiliriyoruz.
 WCF Rest Starter Kit ile beraber "Past XML as Types"
Elimizde gelen hazır bir formatta XML yaratalım!
Elimize aşağıdaki gibi hazır bir formatta XML geldiğini varsayalım. Bir
şekilde bu XML ile aynı yapıda elimizde yer alan farklı bir veriden XML
oluşturmak durumunda kalırsak tek tek her tagı yaratan XElement, XAttribute vs
nesnelerini yaratmamız gerekecektir. Oysa eğer bilgisayarınızda WCF Rest Starter
Kit yükledi iseniz işiniz daha kolay.
[XML]
<?xml version="1.0" encoding="utf-8" ?>
<DenemeVeri>
<Urunler>
<Urun No="145">
<Adi>Örnek Ürün</Adi>
<Kodu>df234sd</Kodu>
</Urun>
<Urun No="146">
<Adi>Örnek Ürün</Adi>
<Kodu>df234sd</Kodu>
</Urun>
</Urunler>
</DenemeVeri>
WCF Rest Starter Kit kurulumunu tamamladıktan sonra doğrudan Visual
Studio'nun Edit menüsüne giderseniz "Past XML as Types" diye
bir seçenek göreceksiniz. Yukarıdaki örnek XML'i kopyaladıktan sonra Visual
Studio içerisinde herhangi bir projeye yeni bir CS dosyası ekleyip içine
kopyaladığımız XML'i "Past XML as Types" diyerek yapıştıralım.
[C#]
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class DenemeVeri
{
private DenemeVeriUrunler urunlerField;
/// <remarks/>
public DenemeVeriUrunler Urunler
{
get
{
return this.urunlerField;
}
set
{
this.urunlerField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class DenemeVeriUrunler
{
private DenemeVeriUrunlerUrun urunField;
/// <remarks/>
public DenemeVeriUrunlerUrun Urun
{
get
{
return this.urunField;
}
set
{
this.urunField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class DenemeVeriUrunlerUrun
{
private string adiField;
private string koduField;
private DenemeVeriUrunlerUrunFiyatlar fiyatlarField;
private byte noField;
/// <remarks/>
public string Adi
{
get
{
return this.adiField;
}
set
{
this.adiField = value;
}
}
/// <remarks/>
public string Kodu
{
get
{
return this.koduField;
}
set
{
this.koduField = value;
}
}
/// <remarks/>
public DenemeVeriUrunlerUrunFiyatlar Fiyatlar
{
get
{
return this.fiyatlarField;
}
set
{
this.fiyatlarField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public byte No
{
get
{
return this.noField;
}
set
{
this.noField = value;
}
}
}
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.3521")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class DenemeVeriUrunlerUrunFiyatlar
{
private byte[] fiyatField;
private byte seviyeField;
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("Fiyat")]
public byte[] Fiyat
{
get
{
return this.fiyatField;
}
set
{
this.fiyatField = value;
}
}
/// <remarks/>
[System.Xml.Serialization.XmlAttributeAttribute()]
public byte Seviye
{
get
{
return this.seviyeField;
}
set
{
this.seviyeField = value;
}
}
}
Yukarıda da gördüğünüz üzere biraz önce yapıştırdığımız tüm XML kodu bir anda
Entity'ler olarak karşımıza çıkıyor. Böylece artık bu Entity'leri kullanarak
aynı formatta bir XML yaratabiliriz. Gelin bir deneyelim;
[C#]
DenemeVeri Ornek = new DenemeVeri();
DenemeVeriUrun[] Urunler = new DenemeVeriUrun[1];
DenemeVeriUrun YeniUrun = new DenemeVeriUrun();
YeniUrun.Adi = "Örnek Ürün";
YeniUrun.Kodu = "123";
YeniUrun.No = 123;
Urunler[0] = YeniUrun;
Ornek.Urunler = Urunler;
XmlSerializer MySerializer = new XmlSerializer(typeof(DenemeVeri));
TextWriter TW = new StringWriter();
MySerializer.Serialize(TW, Ornek);
Response.Write(TW.ToString());
Yukarıdaki kod içerisinde aslında XML taglarından türetmiş olduğumuz
Entity'leri kullanarak yeni bir XML kaynağı yaratabiliyoruz. Tüm bunları
yaparken nesneler tanımlı olduğu için hem nested itemların yapılarını kontrol
etmemize gerek kalmıyor hem de Intellisens bize yardımcı oluyor :)
Peki ya XML sorgularken?
Elimizde tanımı hazır bir XML dosyasından Entity'leri yarattığımıza göre
aslında yine bildiğimiz bir XML'i okuyarak bu Entity'lere de çevirebiliyor
olmamız gerek. Böylece XML sorgularken karşılaştığımız ve karşımızdaki XML'in
yabancı bir yapıya sahip olmasından yola çıkan zorluklardan yine kurtulabiliriz.
[C#]
XDocument Dok = XDocument.Load(Server.MapPath("XMLFile.xml"));
XmlSerializer MySerializer = new XmlSerializer(typeof(DenemeVeri));
TextReader TW = new StringReader(Dok.ToString());
DenemeVeri Denek = MySerializer.Deserialize(TW) as DenemeVeri ;
Response.Write(Denek.Urunler.Count());
Yukarıda gördüğünüz kod içerisinde ilk olarak makalemizin başındaki XML'in
kayıtlı olduğu bir XML dosyasını okutuyoruz. Söz konusu XML dosyasının
içeriğinden yarattığımız Entity'ler projemizin içerisinde yine hazır
bulunuyorlar. Bu noktadan sonra tek yapmamız gereken eldeki XML'i
DeSerialize ederek yine elde tanımlı Entity'lere
çevirmek. Çeviri işlemini de tamamladıktan sonra artık rahat rahat istediğimiz
veriye Intellisense'in de yardımı ile ulaşabiliriz. Hedef XML'in yapısı hiç
bilmesek de sorgulama yapmak Entity'ler sayesinde kolaylaşıyor.
[C#]
Response.Write((from inc in
Denek.Urunler where inc.No==145 select inc.Adi).Single());
Yukarıda gördüğünüz sorgu aslında biraz önce DeSerialize
ettiğimiz XML'i sorguluyor. Yine Intellisense ve LINQ yardımı ile sorgunun
kodunu yazmak da çok kolaylaşıyor.
Hepinize kolay gelsin ;) C#'cılar ;)
Bugün Muğla Üniversitesi'ndeydim. LINQ, WPF, Silverlight ve
AJAX oturumları yaparak yine bir günde bolca bilgi paylaşımı gerçekleşti
diyebilirim. Üniversitedeki gençlerin özellikle sınav sonrası olmasına rağmen
seminerlerdeki enerjileri beni hayran bıraktı diyebilirim. Ne kadar şanslı
olduklarını pek farkında değiller belki ama Visual Basit.NET gördükleri için
bence çok ayrıcalıklılar :) Uzun süreden sonra ilk defa demolarımı rahat rahat
VB ile yapabildim ve rezalet bir şekilde C# alışkanlıkları edinip VB'ye
bulaştırmaya başladığımı gördüm :) Gereksiz toString'ler falan :) Her neyse...
Muğla üniversiteden mezun olan bir gencin VB.NET, ADO.NET ve SQL bilerek
mezun olduğunu görmek beni çok sevindirdi. Bu üçlünün bir biri ile bağlantısını
da kurduktan sonra aslında yapamayacağınız pek bir şey kalmıyor gibi. Üzerine
bir de seminerlerimizdeki konuları eklerseniz süper yazılımcılar olacağınızdan
emin olabilirsiniz.
 Muğla Üniversitesi Seminerlerim
Buradan etkinlikteki katkılarından dolayı Hasan Burak Öztürk kardeşim ve
sevgili hocalarımıza çok teşekkür ediyorum. Umarım herkes için faydalı bir
etkinlik olmuştur. ;)
Hafta sonu Eskişehir'deyiz! Osmangazi Üniversitesi Fen Edebiyat Fakültesi (F5 Blok) Konferans Salonu'nda
iki günlük bir program ile zevkli bir hafta sonu geçirmek isteyen herkesi
bekliyoruz. Etkinlik planını aşağıdaki görselde bulabilirsiniz.
 INETA Eskişehir Hit Afişi
Etkinlik serisi tamamen halka açık ve herhangi bir şekilde kayıt olmanız
gerekmiyor. Görüşmek üzere...
Son iki gündür Erzurum, Atatürk Üniversitesi'ndeydim.
Silverlight, WPF, AJAX, LINQ konularına değindiğimiz ikin
günlük bir serinin sonunda minik bir de DreamSpark dağıtımı yaptıktan sonra iki
saatlik gecikme ile uçağıma binip dönüp dolaşım yine :) İstanbul'a döndüm. Oturumlarda şaşkınlık ile
karışık bir tepkisizliğin hakimiyetine karşın aralarda aldığım tepkiler çok
sıcaktı. Anadolu'daki üniversitelerin havası gerçekten çok farklı, Erzurum'da da
bunu yaşadım. Gençlerin gözlerindeki ışıltı ve kaba tabiri ile doğu
bölgelerindeki bu gibi etkinliklere yönelik ihtiyacın tam olarak giderilememesi tezatı beni gerçekten üzüyor. Olanaklar el verdikçe Anadolu üniversitelerine
gidiş sevdamı ben de bu şekilde tatmin etmeye çalışıyorum :)
 Erzurum, Atatürk Üniversitesi Seminerlerim
Tabi ki yine teşekkür etmem gereken onlarca dost var Erzurum'dan.
Yüksel hocama ve afacana buradan selamlarımı gönderdikten sonra :)
öğrenci kardeşlerimden de Mehmet Keklik'e etkinliğe vesile
olması ve organizasyondaki katkısı için çok teşekkür ediyorum. Umarım seneye
taptaze ve daha dolu bir etkinlik ile tekrar buluşuruz ;)
Son iki gündür sevgili
Uğur Umutluoğlu ile Ankara, Bilkent Üniversitesi'ndeyiz. Toplam iki gün
süren ve 6 oturumdan oluşan bir seri ile birçok konuya değindik. WPF,
WCF, LINQ, C# 3.0, Silverlight, ASP.NET 3.5 SP1 başlıklarına sahip
oturumların hepsinde de muhteşem ilgili bir kitle bulunduğunu itiraf etmeliyiz.
 Bilkent Üniversitesi, Ankara, Silverlight Oturumum
Oturumlarımızdan birini de LAB çalışması olarak gerçekleştirdik ve
Silverlight seminerinde öğrendiklerimizi Silverlight ile bir oyun geliştirerek
pekiştirdik. LAB çalışması benim neredeyse etkinlik içerisinde en sevdiğim bölüm
oldu. "Üretmenin" zevkini herkesin gözlerinde gördüm.
 Silverlight Lab Çalışması
Buradan teşekkür etmem gereken o kadar çok kişi var ki :) Sevgili MSP'lerimiz
Ali Uğur Çakmak,
Alper Özçetin'a çok
teşekkürler. Ayrıca BTS ve ACM'deki herkese teşekkürler. Süper bir hafta sonu
geçirdim, "dayının yeri"ni hala unutamıyorum :)
Bu hafta sonu İzmir'deydik. Daha önce sizlere duyurmuş olduğum
INETA EGE HIT etkinliğini Dokuz Eylül Üniversitesi'nde gerçekleştirdik.
Katılımcı profili gerçekten muhteşemdi, hem Cumartesi hem de Pazar günü en ufak
bir oturumu bile kaçırmayın daimi bir kitlemiz vardı :) Benim için çok eğlenceli
ve sevindirici oldu diyebilirim. Her oturumda aldığım tepkiler çok güzeldi.
 INETA
Ege Hit başlangıcı.
Her zamanki gibi iki de anekdot yarattık; birincisi benim gülen surat
çizimimi görüp animasyon olarak "yağmur yağsın ve şemsiye açılsın" diyen
arkadaşımızdı :) Dikkatinizi çekerim gülen suratın ne yağmur ne de şemsiye ile
alakası yok ayrıca İzmir'de yağmur falan da yapmıyordu :) Her neyse... İkinci
anekdot ise buradan paylaşamayacağım hatta sanırım ömür boyu hiç
paylaşamayacağım bir şey :) Üzgünüm...
 INETA
Ege Hit sonu...
Organizasyondaki katkılarından dolayı sevgili İzmir MSP'lerimize buradan ÇOK
teşekkür ediyorum. Sevgili
Buğra, Murat,
Gülşah ve
Okan'a çok
teşekkürler. Etkinlik boyunca çekilen resimlerin orijinal boyutlu hallerine
buradan ulaşabilirsiniz. Ayrıca tüm oturumlardaki örneklere ait kodları da
aşağıdaki linkten bilgisayarınıza indirebilirsiniz.
Oturumlardaki örnek projeler - 11012009.rar (5,11 MB)
Bugün Abdurrahman – Nermin Bilimli Anadolu Teknik Lisesi'ndeydim.
Cevher gibi VB.NET bilen gençlerin arasında 5 saat geçirdim. Tüm bu sürede
Silverlight ve WPF dünyasına göz attık, sona
doğru da hızlıca bir LINQ girişi yaptık. Meslek liselerinde
heyecan beni de bir o kadar heyecanlandırıyor. Zaten bu konuda çok yakında bazı
ek duyurular da yapacağım. Ülkemizin bilişim ve özellikle yazılım üretimi ile
gelir elde eden bir ülke olabilmesi için meslek liselerinin önemi bence çok
büyük. Aşağıdaki fotoğrafa baktığınızda eminim ki sizler de benimle aynı
duyguları paylaşacaksınız.
 Abdurrahman-Nermin Bilimli Anadolu Teknik Lisesi
Organizasyon için sevgili hocalarımıza çok teşekkür ediyorum. Normalde 3 saat
olarak planladığımız etkinliği onların da desteği ile 5 saate uzattık. Her şey
çok güzeldi. Tek sorun : "Meslek liselerini ziyaret ettikçe kendimi daha
yaşlanmış hissetmem" :)
Seminere katılan tüm kardeşlerimi buradan öpüyorum.
Son üç gündür Isparta, Süleyman Demirel Üniversitesi'ndeydim. Cumartesi günü
başladığımız INETA Boot Camp Isparta etkinliğimizde
LINQ ve WCF konularını işledik. Pazar günü
Microsoft'un Oyun Turu'nun da Isparta ayağını kampımıza ekleyerek dün de
bahsettiğim gibi SL 2.0 ile ve XNA ile Oyun Programlama konularını inceledik.
Son günümüz olan Pazartesi günü de ASP.NET Dynamic Data Web Site
yapılarını göz attık sonra "Silverlight 2.0 ile Data Uygulamaları"
ve "WPF" oturumlarımızı tamamladık. Böylece dolu dolu bir üç
gün geçirdik.
 Isparta, Süleyman Demirel Üniversitesi, INETA Boot Camp
Etkinliklere katılan hem konuşmacı arkadaşlarıma hem de sevgili öğrenci
kardeşlerime çok teşekkür ediyorum. Geçen öğretim yılında da Süleyman Demirel
Üniversitesi'nde gittiğimde blogumda yazmıştım hatta dün de yazmışım :) SDÜ'nün
yeri benim için çok ayrı. Yukarıda resimde gördüğünüz tüm öğrencilerin
Silverlight ve WPF konulu ödevleri var. Hepsi giriş seviyesini çoktan geçmiş
durumda. Bu duruma tabi ki öğretim görevlilerinin katkısı çok büyük.
Özellikle organizasyonun gerçekleşmesindeki katkılarından dolayı sevgili Eğitim Görevlisi dostum
Mehmet Albayrak'a çok teşekkür ediyorum.
Son gün yaptığımız bazı örnekleri toparlayıp bir poşete koydum :) aşağıdaki
linkten indirebilirsiniz.
Örneklere ait kaynak dosyalar - 01122008_2.rar (2,81 MB)
Bugün YTÜ, Davutpaşa Kampüsü'ndeydim. Güne ağır bir
LINQ oturumu ile başladık :) Biraz herkesi sıkıntı bastı :) Sonra yemek
molası ile dinlenip WPF ve Silverlight
oturumlarına geçtik. Günün sonunda aldığım tepkiler ne mutlu ki her zamanki gibi
muhteşemdi. YTÜ'nün Davutpaşa Kampüsü'ndeki enerjisi Beşiktaş Kampüsü'nden açık
ara önde :) Böylece mini bir gaz da vermiş olayım :)
 YTÜ, Davutpaşa Kampüsü, LINQ, Silverlight ve WPF Seminerleri
Çok eğlendiğim, süper yorumlar almanın yanı sıra seminerler esnasında
sorduğum sorulara da burada yer veremeyeceğim derecede fantastik cevaplar
aldığım bir gün oldu :) Katılan tüm arkadaşlara çok teşekkürler.
Organizasyondaki katkılarından dolayı sevgili Bahar Göktepe
ve Mehmet Cengiz'e çok teşekkürler.
Bugün Afyon Kocatepe Üniversitesi'ndeydim. Sabahtan
başlayarak Silverlight 2.0, WPF, LINQ ve ASP.NET
Dynamic Data konularına değinerek zevkli bir gün geçirdik. Günün
sonunda tadına vardığım Afyon kaymağı ve ekmek kadayıfı süper ikilisi aslında
neredeyse oturumları uzatarak Afyon'a yerleşmeme bile sebep olacaktı :)
 Kocatepe Üniversitesi 2. Bilişim Günleri oturumlarımın sonundan bir kare.
Aktivite boyunca yardımlarından dolayı teşekkür etmem gereken o kadar çok
kişi var ki kesinlikle atladığım kardeşlerim olacaktır. İster üniversite
dahilinde öğretim görevlisi olsun ister öğrenci olsun aktivitede emeği geçen
herkese ve tabi ki tüm katılımcılara çok teşekkürler. Muhteşem bir aktiviteydi.
Organizasyondaki katkılarından dolayı sevgili Sadık Oral'a
özellikle teşekkür ediyorum.

Rektör Yardımcısı Prof. Dr. Belkıs Özkara - Daron Yöndem
.NET 3.5 SP1 ile beraber gelen Dynamic Data Web Site yapısı
ile beraber doğrudan sadece veri üzerinde çalışan web uygulamaları yazmanın
gerçekten kolaylaştığını itiraf edebiliriz. Fakat her yeni araç gibi Dynamic
Data ile beraber de istediklerimizi yapabilmek için kendine özgü özelleştirme
kurallarını bilmemiz gerek. Bu yazıda elimizde hazır bir Dynamic Data
Web Site olacak ve bu web sitesinde gösterilen veritabanındaki bazı
tablolardaki bazı sütunların gösterim esnasındaki özelleştirmelerine
değineceğiz. Cevaplayacağımız sorulardan bazıları şunlar olacak;
- Belirli bir tablonun sadece bir sütununun görünmemesini nasıl sağlarım?
- İstediğim bir sütunun istediğim değerleri almasını nasıl sağlarım?
Yazımızda kullanacağımız örnek siteyi yaratmak için
buradaki yazıyı inceleyebilirsiniz.
MetaData üzerinden ayarlamalar...
Dynamic Data yapısına baktığımızda olabildiğince her şeyin otomatik
ilerlediğini görüyoruz. Örneğin bir tablonun içerisindeki tüm sütunlar otomatik
olarak söz konusu tablo ile beraber tüm sayfalarda düzenlenebilir şekilde
gözükmeye başlıyor. Sütunlarla ilgili tek tek ayar yapmanın tek yolu söz konusu
sütunlara ek MetaData bilgileri vermek. Peki bizim sütunlarımızı kodumuzla kim
tanımlıyor?
Biz projemizde LINQ2SQL kullanarak ilerlediğimiz için veritabanındaki her bir
nesneyi tanımlayan objeler LINQ'e ait DBML'in arkasında tanımlanmış durumda. Bir
DBML dosyasının arkasına baktığınızda designer.vb veya
designer.cs uzantılı dosyalar görebilirsiniz. Bu dosyalar içerisinde
veritabanındaki tüm nesnelerin birer kopyası .NET nesneleri olarak
yaratılmıştır.
[VB]
<Table(Name:="dbo.Urunler")> _
Partial Public Class Urunler
Implements System.ComponentModel.INotifyPropertyChanging, System.ComponentModel.INotifyPropertyChanged
[C#]
[Table(Name="dbo.Urunler")]
public partial class Urunler : INotifyPropertyChanging, INotifyPropertyChanged
{
Yukarıda gördüğünüz şekilde başlayan Urunler adındaki Class
DBML dosyasının arkasında duruyor ve bizim her bir ürünümüzü tanımlıyor.
Maalesef bu designer dosyalarında değişiklik yapamıyoruz. Aslında değişiklik
yapabilirsiniz fakat DBML dosyasında Visual Studio arayüzündeki tasarım araçları
ile yaptığınız her işlem bu dosyaların sistem tarafından tekrar yaratılmasına
neden olacağı için kullanıcı tarafından yapılan tüm kod değişiklikleri
kaybolacaktır. Peki bu durumu nasıl çözeceğiz? Dikkat ettiyseniz tüm bu sınıflar
Partial olarak tanımlanmıştır yani bir başka bir dosyada tekrar
Partial birer sınıf yaratarak işlemlerimize devam edebiliriz.
Bu durumda buyurun yeni bir VB/CS dosyası oluşturalım ve Partial
olarak aynı sınıftan bir adet daha yaratalım.
[VB]
<ComponentModel.DataAnnotations.MetadataType(GetType(UrunlerMeta))> _
Partial Public Class Urunler
End Class
[C#]
[System.ComponentModel.DataAnnotations.MetadataType(typeof(UrunlerMeta))]
public partial class Urunler
{
}
Yukarıdaki koda baktığınızda özellikle en üstteki MedadataType
işaretleri dikkatinizi çekecektir. Aslında bu da bir MetaData fakat maalesef bu
şekilde Partial sınıflara doğrudan MetaData
veremiyoruz. O nedenle başka bir sınıf yaratarak MetaData'ları orada tutacağız
ve o sınıftan MedaData'ları bu tarafa aktaracağız. Kodumuz içerisinde
UrunlerMeta olarak geçen obje aslında başka bir sınıfın adı.
[VB]
Public Class UrunlerMeta
Private _Fiyati As Object
<ComponentModel.DataAnnotations.Range(10, 20, errormessage:="Hata!")> _
Public Property
Fiyati() As Object
Get
Return _Fiyati
End Get
Set(ByVal value As Object)
_Fiyati = value
End Set
End Property
End Class
[C#]
public class UrunlerMeta
{
[System.ComponentModel.DataAnnotations.Range(10, 20, ErrorMessage = "Hata!")]
public object Fiyati { get; set; }
}
UrunlerMeta sınıfı içerisinde sadece Fiyati
adında bir Property var. Aslında ana Urunler
sınıfındaki tüm Property'leri burada da tanımlayarak kullanabilirdik fakat
şimdilik bize Fiyati Property'si yeterli.
ComponentModel.DataAnnotations altından Range sınıfını
kullanarak Fiyati değerinin 10 ile 20 arasında olmak zorunda
olduğunu ve bu durumun sağlanmaması halinde de hata olarak "Hata!"
yazısının gösterilmesi gerektiğini belirtiyoruz. Gelin bu kodun bir de web
sitesindeki yansımasına göz atalım.
 Range sınıfı ile yaptığımız ayarlamalar arayüzde kendini gösteriyor.
Başka neler yapabiliriz?
MetaData'lar üzerinden başka neler yapılabileceği ile ilgili çok sayıda
farklı senaryo mevcut fakat en basit örnekleri inceleyebilmek için kabaca
ComponentModel.DataAnnotations sınıfına göz atmak yeterli olacaktır.
Örneğin aşağıdaki gibi bir kod istediğiniz bir kolonun web sitesinde
gösterilmemesini sağlayabilir.
[VB]
<ComponentModel.DataAnnotations.ScaffoldColumn(False)> _
[C#]
[System.ComponentModel.DataAnnotations.ScaffoldColumn(false)]
Peki ya diğer seçenekler? Gelin hızlı bir tur atalım.
DisplayColumn
Bu özellik toplam en fazla üç parametre alabilir. Amacı tablolar arası
ilişkilendirmelerde kullanıcının gördüğü metinleri değiştirmektir. Örneğin bizim
projemizde ürünlere bağlı olan kategorilerin adları otomatik olarak her üründe
gösteriliyor. Sistem aslında arka planda Kategoriler tablosunda
ID(PK) kolonundan sonra karşılaştığı ilk String kolonu alarak göstermeye göre
ayarlı. Oysa bazı durumlar FK'in bağlı olduğu tablodan alınması gereken ve
gösterilecek olan metin çok daha ileride farklı bir sütunda olabilir. İşte
DisplayColumn bunu ayarlıyor ve bir FK durumunda ana tablodan
hangi sütunun bu üründe gösterilmesi gerektiğine karar veriyor. Bunun haricinde
aldığı iki diğer parametrenin ilki hangi kolon üzerinden Sorting
yapılabileceği ve üçüncü parametre ise Sorting işleminin ilk açılışında hangi
yönde yapılacağı verisini taşıyor.
RegularExpression
Kendisine ilk parametre olarak verilen RegEx desenini hedef kolona test eden
ve uyuşmaması durumunda da ikinci parametre olarak verilen hata mesajının
gösterilmesini sağlayan bir Validation sisteminin entegrasyonuna yönelik olarak
kullanılabilir.
Required
Sadece tek bir parametresi vardır; eşleştirildiği sütun için veri girilmez
ise gösterilmesi gereken hata mesajını String olarak alır.
ScaffoldTable
Tablo sınıflarına doğrudan verilebilen bu MetaData ile bir tablonun web
sitesi görselliğinde gösterilip gösterilmeyeceğini belirler.
StringLength
Bir sütuna girilebilecek maksimum metin uzunluğu ilk parametresi olarak alır.
İkinci parametresinde ise söz konusu uzunluk aşıldığında gösterilecek olan hata
mesajını saklar.
Sonuç
Yazı boyunda Annotation'lar içerisinde atladığım bazı seçenekler oldu. Bu
seçenekleri ileriki yazılarda daha detaylı olarak incelememiz gerektiği için
şimdilik yüzeysel olarak geçmek istemedim.
Hepinize kolay gelsin.
Hafta sonunu Ankara'da geçirdik. Neden mi?
INETA Capital Hit zamanıydı! Atladık INETA minibüsümüze :) yollara düştük.
Maceralarımızla ilgili videolar ve fotoğraflar çok yakında bu blogda :)
İki kocaman gün boyunca dopdolu bir programla Çankaya Üniversitesi'nde
iki yüz elli kişilik bir ekip olarak yattık kalktık diyebilirim. Yine her zamanki gibi benim için muhteşem zevkliydi.
 Pazar akşamı saat yedide Capital Hit'i sonlandırdık.
Aktiviteye katılan tüm konuşmacı dostlarıma binlerce teşekkür. Ayrıca Çankaya
Üniversitesi Bilişim Kulübü ve sevgili MSP, Çağrı Erdoğan'a da çok teşekkürler.
Bir organizasyonda ancak bu kadar başarılı bir misafirperverlik
sergilenebilirdi.
Tabi ki her şey bu kadarla bitmiyor! Elimde birçok fotoğraf, minibüs
yolculuğumuzdan videolar ve panel kaydımız var. Hepsini büyük bir hızla
hazırlamaya çalışıyorum. En kısa zamanda sizlerle buradan paylaşacağım.
Şimdilik aşağıdaki sunumlarla idare edelim :)
AdoNet Data Services / Burak Selim Şenyurt - 20102008_1.pptx (1,01 MB) LINQ / Uğur Umutluoğlu - 20102008_2.pptx (750,29 KB) WCF / Burak Selim Şenyurt - 20102008_3.pptx (460,14 KB)
Not: Bu sefer ben hiç sunum kullanmadım, doğrudan demolarla ilerledim. O
nedenle sunum paylaşamıyorum.
INETA Summer Hit üzerinden uzun bir zaman geçti gibi hissettiğimiz bu
günlerde yeni bir aktivite serisi ile tekrar karşınızdayız. Bu sefer İstanbul
değil Anadolu'nun merkezi, Başkentimiz Ankara'da olacağız.

Dikkat ederseniz İstanbul'daki Summer Hit sonrası içeriğimizi de epeyce
değiştirdik. Tabi bunda sizlerin doldurmuş olduğu değerlendirme formlarının
etkisi çok büyük. Bu sefer çok daha sıkışık ve yoğun bir tempomuz olacak.
Hediyelerimiz daha fazla (hatta çok ilginç beklenmedik şeyler var :)) ve içecek sorununu da hallettik (:))
İlk gün sabah yine SL 2.0 ile başlayıp sonra benim çok önem
verdiğim IIS 7'ye geçeceğiz. IIS 7.0 üzerinde ASP.NET
ve PHP tarafında çok güzel yenilikler var. Sonrasında her
zamanki gibi bir sohbet panelimiz olacak. Son olarak LINQ ile
ilk günümüzü kapatacağız. İkinci gün WPF ile başlayarak
ADO.NET Data Services konusunu inceleyeceğiz. Heyecanlandığınızın
farkındayım :) Sonrasında IE 8.0 ile gelen yazılımcı ve
tasarımcıları ilgilendiren yenilikler ve yeni uygulama platformlarını
inceleyerek WCF dünyasına da atılarak iki günü sonlandıracağız.
Aktiviteye üniversite girişinde güvenlik sorunları yaşamamak adına kayıt
olmanız şart.
Kayıt adresi:
http://daron.yondem.com/kayit/
Emeklerinden dolayı buradan sevgili MSP, Çağrı Erdoğan'a
çok teşekkür ediyorum.
Aktiviteyi duyururken geçen sefer güzel bir başarı elde etmiştik. Bu sefer de
yine aşağıdaki bannerı kullanabilirsiniz. Banner'a tıklandığında link olarak da
kayıt adresini verebilirsiniz.

Hepinizi bekliyorum ;)
Başlık olarak “Reflection” yazdıktan sonra ardına sayfalarca açıklama ve örnek konulabilir. Hatta bu konuda ayrı bir kitap bile yazılabilir. Reflection’ın çok farklı kullanımlar var. Özetleyerek hızlı bir şekilde tanımlamak istersek aslında Reflection bize hakkında bilgi sahibi olmadığınız programatik nesnelerle ilgili çalışma zamanında (run-time) bilgi alabilmemize olanak tanıyan bir metottur. Peki böyle bir şeye neden ihtiyacımız olsun? En basit örnek gerçek zamanlı olarak uygulamalara farklı DLL dosyalarının bağlandığı durumları gösterebiliriz. Böyle bir durumda kaynak konumdaki sınıflar veya metotlar ile ilgili herhangi bir bilgi bulunmaz. Söz konusu bu bilgilerin program çalışırken elde edilerek kullanılması gerekir.
Gelin ilk olarak Reflection’ın yapısını ve sistemini tanımak adına tek bir uygulama içerisinde nasıl kullanılabileceğimize göz atalım. Örnek uygulamamızda aşağıdaki şekli ile tanımlanmış bir Urun sınıfı kullanacağız.
[VB]
Public Class Urun
Private PAdi As String
Public Property Adi() As String
Get
Return PAdi
End Get
Set(ByVal value As String)
PAdi = value
End Set
End Property
Sub New()
End Sub
Sub New(ByVal adi As String)
Me.Adi = adi
End Sub
Function Uyari() As String
Return "Ürünün adı: " & Me.Adi
End Function
End Class
[C#]
public class Urun
{
private string PAdi;
public string Adi
{
get { return PAdi; }
set { PAdi = value; }
}
public Urun()
{
}
public Urun(string adi)
{
this.Adi = adi;
}
public string Uyari()
{
return "Ürünün adı: " + this.Adi;
}
}
Uygulamamız içerisinde iki adet düğme yer alacak ve kullanacağımız Windows penceresinde global olarak tanımlanmış bir de
Object tipinde değişkenimiz bulunacak.
[VB]
Dim BirUrun As Object
[C#]
object BirUrun;
Uygulama içerisindeki düğmelerden birine basıldığında global BirUrun değişkenimiz yeni bir
Urun değişkenine dönüştürülecek.
[VB]
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
BirUrun = New Urun
End Sub
[C#]
private void button1_Click_1(object sender, EventArgs e)
{
BirUrun = new Urun();
}
Programımız içerisinde diğer düğmeye basıldığında BirUrun adındaki değişkenimizin
Adi özelliğini değiştirerek Uyari adındaki metodunu kullanmak istiyoruz. Fakat Visual Studio içerisinde maalesef ki
BirUrun adındaki değişkenle beraber Urun tipine ait Intellisense desteği gelmeyecektir. Aslında bu durumun haklı bir nedeni var. İkinci düğmeye basıldığında
BirUrun adındaki değişkenin tipininin Object mi yoksa
Urun mü olacağı belli değil. İşte tam da istediğimiz ortamı yaratmış olduk. Kullanacağımız nesnenin tipi belirsiz ve biz ona ait bazı özellikleri kullanmak istiyoruz.
Bu durumda ilk olarak ikinci düğmeye basıldığında gerçekten BirUrun değişkeninin tipi
Urun mü yoksa değil mi sorusunu kontrol etmemiz lazım.
[VB]
If TypeOf (BirUrun) Is Urun Then
End If
[C#]
if ((BirUrun) is Urun)
{
}
Buraya kadar her şey çok kolay. Bundan sonra eğer IF kontrollerimize olumlu sonuç dönüyorsa ilk olarak gidip nesnenin
Adi özelliğini bulmamız ve ona bir değer aktarmamız gerekiyor.
[VB]
BirUrun.GetType.GetProperty("Adi").SetValue(BirUrun, "Daron", Nothing)
[C#]
BirUrun.GetType().GetProperty("Adi").SetValue(BirUrun, "Daron", null);
Yukarıdaki kod ile elimizdeki nesnenin tipini bilmeden onun Adi adındaki özelliğini (property) yakalayarak değerini
Daron olarak değiştiriyoruz. Kodumuzu detaylı olarak adım adım bakacak olursak ilk aşamada nesnenin tipini
GetType ile alıyoruz. Sonrasında ise tipini yakaladığımız nesnenin
GetProperty ile Adi adındaki özelliğini alarak
SetValue ile söz konusu özelliğin değerini değiştiriyoruz.
SetValue metodu toplam üç parametre alıyor; bunlardan ilki değer değişikliği yapılacak nesnenin kendisi, ikincisi yeni atanacak olan değer, üçüncüsü ise eğer değiştirilecek olan özellik (property) indeksli ise söz konusu indeks değeri. Bizim örneğimizde indeksli bir özellik olmadığı için bu parametreyi boş geçiyoruz.
Değer atamamızı tamamladığımıza göre bu sefer de sıra geldi BirUrun değişkenimize ait
Uyari metodunu çalıştırmaya. Metodumuz bize bir String döndürecek biz de onu doğrudan bir mesaj kutusu ile kullanıcıya göstereceğiz.
[VB]
BirUrun.GetType.InvokeMember("Uyari", Reflection.BindingFlags.InvokeMethod, Nothing, BirUrun, Nothing)
[C#]
BirUrun.GetType().InvokeMember("Uyari", System.Reflection.BindingFlags.InvokeMethod, null, BirUrun, null).ToString();
Reflection kullanarak türü bilinmeyen bir nesnenin bir metodunu çalıştırmak için
InvokeMember metodundan faydalanmamız gerekiyor. InvokeMember aslında çok geniş kullanımı olan bir metod, biz şimdilik sadece bir çeşit kullanımına değineceğiz. Örneğimizde
InvokeMember bir metod çalıştıracağı için ilk parametresinde
çalıştırılacak olan metodun adını ikincisinde BindingFlags.InvokeMethod ile bir
Metod çalıştırılacağını belirtiyoruz. Üçüncü parametre bizim şimdilik kullanım alanımız dışında kalan Binding’lerle ilgili, aynı şekilde beşinci parametre de boş bırakılarak geçilecek. Dördüncü parametrede ise hedef nesnemiz olan
BirUrun değişkenimizi atayacağız. Böylece metodumuzu da çalıştırmış olduk.
Dinamik DLL Kullanımı
Kabaca Reflection’ın nasıl kullanılabildiğine dair bir örnek yaptıktan sonra
artık sıra geldi harici bir DLL dosyasının çalışma anında programımıza ekleyerek
içerisindeki yapıları kullanmaya. Bu çeşit bir işlevselliği özellikle gerçek
zamanlı DLL derlemesi ile birleştirdiğinizde çok farklı bir dünyaya kapı açmış
olacaksınız. Hedef olarak kullanacağımız DLL dosyasını aşağıdaki kodlardan yaratacağız.
[VB]
Public Class Deneme
Function Metin() As String
Return "Çalışıyor"
End Function
End Class
[C#]
public class Deneme
{
string Metin()
{
return "Çalışıyor";
}
Yarattığımız DLL dosyasını uygulamamız ile aynı konuma yerleştirdikten sonra aşağıdaki kod ile DLL’imizi kullanmaya başlayabiliyoruz.
[VB]
Dim BirAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom("ornek2.dll")
[C#]
System.Reflection.Assembly BirAssembly = System.Reflection.Assembly.LoadFrom("ornek2.dll");
Artık yukarıda tanımladığımız Assembly üzerinden Reflection kullanarak ilerleyebiliriz. İlk olarak
Deneme adında sınıfımızdan bir instance almamız gerekecek. Bunun için
Deneme tipini bulmamız lazım.
[VB / C#]
BirAssembly.GetModule("Ornek2.dll").GetType("Deneme")
Assembly üzerinden modülümüzü yakalıyor sonra da Deneme adındaki tipinizi buluyoruz. Tabi tipi bulmak yeterli değil, söz konusu tipte bir değişken yaratmamız gerekiyor.
Activator sınıfını kullanarak bu tip üzerinden bir instance yaratarak
Sinif adında bir değişkene aktaracağız.
[VB]
Dim Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"))
[C#]
object Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"));
Yarattığımız sınıfın maalesef özellikleri otomatik olarak gelmeyecek. O nedenle
Metin adındaki metodumuzu da elle bularak çalıştırmak zorundayız.
[VB]
BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, Nothing)
[C#]
BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, null)
Yine Assembly üzerinden yola çıkarak bu sefer daha da ileri gidiyoruz.
Deneme sınıfımızı bulduktan sonra içerisinde Metin adındaki metodumuzu buluyor ve doğrudan
Invoke ile söz konusu metodu çalıştırıyoruz. Invoke metodu bizden iki parametre istiyor; bunlardan ilki ana sınıfın kendisi. Bir önceki adımda yakaladığımız sınıfı buraya parametre olarak aktarıyoruz. Diğeri ise bizim kullanmayacağımız Binding parametresi.
Metin metodumuz çalıştırıldığında geriye bir String değişkeni döndürüyor. Bu değişkeni de bir mesaj kutusu ile kullanıcıya göstermek istersek uygulamamızın tam kodunun aşağıdaki şekilde sonlanması gerekiyor.
[VB]
Public Class Form2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim BirAssembly As Reflection.Assembly = Reflection.Assembly.LoadFrom("ornek2.dll")
Dim Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"))
MsgBox(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, Nothing))
End Sub
End Class
[C#]
namespace CSReflection
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
System.Reflection.Assembly BirAssembly = System.Reflection.Assembly.LoadFrom("ornek2.dll");
object Sinif = Activator.CreateInstance(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme"));
MessageBox.Show(BirAssembly.GetModule("Ornek2.dll").GetType("Deneme").GetMethod("Metin").Invoke(Sinif, null).ToString());
}
}
}
Böylece harici bir DLL dosyasını yükleyerek istediğimiz metodu dinamik olarak kullanabildik. Farklı durumlarda isterseniz bir DLL içerisinde tüm metod, sınıf ve özelliklerin listelerini alabilir hatta bunları LINQ sorguları ile tarayabilirsiniz.
[VB]
Dim Metodlar = From Gelenler In BirAssembly.GetModule("Ornek2.dll").GetTypes Where Gelenler.GetMethod("Metin") IsNot Nothing
[C#]
var Metodlar = from Gelenler in BirAssembly.GetModule("Ornek2.dll").GetTypes() where Gelenler.GetMethod("Metin") != null select Gelenler;
Örneğin yukarıdaki LINQ sorgumuz ile harici DLL dosyası içerisinde Metin adında metodu olan tüm sınıfların bir listesini alıyoruz.
Hepinize kolay gelsin.
Bugün INETA Summer Hit 2008'in ikinci gününü de mutlu bir
şekilde sonlandırdık. Yaz aylarında bir hafta sonu etkinliğinde 350 üstü
katılımcıya sahip olmak benim için çok heyecan vericiydi. "Acaba gerçekten
gerek var mı? Yoksa ben mi gaza geliyorum?" sorusunu artık kendi kendime
sormama gerek kalmayacak sanırım. Tüm konuşmacılarımız adına bizi yalnız
bırakmadığınız ve bilgi paylaşımından doğan sevinci yaşamamıza olanak
tanıdığınız için çok teşekkür ediyorum.
 INETA Summer Hit 2008
Gelen maillerden cevaplarını beklediğiniz bazı sorular olduğunu bildiğim için
birkaç noktaya değinmek istiyorum. Aktivitenin video kayıtlarını, tüm çekilen
fotoğrafların tam çözünürlüklü halini, sunumları sizlerle paylaşacağız. Bu gibi
içerikler için benim blogu takip etmenizi tavsiye edebilirim. Bahsettiğim
içerikleri şu an hazırlıyoruz.
Aktiviteyle ilgili teşekkür etmem gereken bir ordu var; sevgili
konuşmacılarımız Ali Rıza
Babaoğlan, Ali
Servet Eyüpoğlu, Eralp
Erat,
Kadir Çamoğlu ve
Uğur Umutluoğlu'na
buradan çok teşekkürler. Organizasyonda benim yardımıma koşan kardeşlerim
Murat Duman, Yiğit Kıran, Görkem
Güngör ve YTÜ Bilişim Kulübü'nden Oğuz Yılmaz, M. Zeki Ersen'e de ayrı ayrı
teşekkürler.
Bugün Edirne M.P. Anadolu Ticaret Meslek ve Ticaret Meslek
Lisesi'nin organizasyonunu üstlendiği Edirne'deki meslek liseleri'nin
yer aldığı bir seminer serisindeydim. Semineri Trakya Birlik Genel
Müdürlüğü Konferans Salonu'nda yaptık. Salon şu ana kadar gördüğüm en
ilginç ve güzel salonlardan biriydi. Balkonuyla beraber iki katlı seminer
salonunda alt kattaki ve üst kattaki dinleyiciler için ayrı projeksiyon
sistemlerinin bulunması dinleyici için çok ergonomik bir ortam sağlıyor.
 Edirne'ye gidip Selimiye Cami fotoğrafı çekmemek olmaz :)
Sabah 09.00 gibi seminerlere başladığımız için bir gün önceden Edirne'ye
gitmek durumunda kaldım. Dün akşam 20.00 gibi Edirne'deydim, Meriç kenarında bir
yemek yeme şansına sahip olmak muhteşemdi. Aslında otobüsle iki buçuk saat gibi
kısa bir sürede gidilebilen Edirne'yi (kendi adıma konuşayım) sanki biraz
farkında değiliz veya unutmuşuz gibime geldi. Rahatlıkla günübirlik gidip
gezilebilecek bir şehir.
 Selimiye Kubbesi İç Motifler
09.00'da başladıktan sonra öğleden sonra 18.00'a kadar WPF,
Silverlight ,AJAX ve LINQ konularına değindik. Bu benim ikinci Meslek
Lisesi deneyimim oldu. Lise çağındaki gençlere hitap edebilmek adına daha çok
çalışmam gerektiğini açıkça itiraf edebilirim :) Yine de aldığım tepkilere göre
faydalı bir gün geçirdik, parıldayan genç gözler gördüm.
 Edirne, MP (Anadolu) Ticaret Meslek Lisesi, WPF, Silverlight, AJAX, LINQ Seminerleri
Aktivite boyunca Edirne TV :) de oradaydı. Hatta sitelerinde de
aktiviteyi haber yyapmışlar. Özellikle sitedeki fotoğrafta biraz çok agresif
çıkmışım :) Zaten herkes sahnede rahat durmadığım için fotoğraf çekememekten
şikayetçi :)
Organizasyondaki emeklerinden dolayı sevgili Serdar Daloğlu'na
, Aziz Bayıroğlu ve Oğuzcan Şahin'e burada bin bir teşekkür ediyorum. Beni
muhteşem bir şekilde ağırlamanın yanı sıra organizasyondaki her tür detayı çok
başarılı bir şekilde yürüttüler.
Özellikle beni microbloğum
twitter.com
üzerinden takip edenlerin farkında olacağı üzere hafta sonunu Ankara'da
geçirdim. Cumartesi gece yarısı yola çıkarak sabahına Ankara'ya vardım ve sabah
10.00 gibi EMO (Elektrik Mühendisleri Odası) Ankara şubesinde eğitim serimize
başladık. WPF, AJAX, Silverlight ve LINQ konularına değindiğimiz eğitimi Pazar
akşamı 18.00'da bitirdik.
 EMO Eğitim Serisi başlangıcından bir kare...
Eğitime katılan arkadaşlara özellikle Silverlight örneğindeki kodları
blogumdan paylaşacağım konusunda söz vermiştim. Aşağıdan gerekli dosyaları
bilgisayarınıza indirebilirsiniz.
Örnek Kodlar - 25052008_2.rar (8,57 KB)
Eğitime katılan ve kocaman bir hafta sonu boyunca yeni teknolojiye olan
ilgilerini ve konsantrasyonlarını en yüksek seviyede tutan tüm arkadaşlara çok
teşekkür ediyorum (Özellikle ikinci gün sınıfa pasta alan kamera fobili
arkadaşımıza ek teşekkürler :))
INETA ve EMO işbirliğinizde düzenlediğimiz bu eğitime katkısından dolayı ODTÜ
Bilgisayar Mühendisliği Araştırma Görevlisi Serdar Çiftçi'ye,
eğitimlere laboratuar ortamı sağlamakla beraber
gösterdikleri sıcak misafirperverlik için de tüm EMO ekibine teşekkürler.
Bugün Konya, Selçuk Üniversitesin'deydim. Sabah 10.00'da
başlayarak 19.00'a kadar WPF, AJAX, Silverlight ve LINQ
konularını inceleyen bir seminer ile güzel bir gün geçirdik. Umarım "yol
yorgunluğum" aktiviteye çok yansımamıştır. Bir gün öncesinde bildiğiniz üzere
Çanakkale 18 Mart Üniversitesin'deydim ve akşam 23.00'da Çanakkale'den mecburen
otobüs ile İstanbul'a döndüm. O saatte uçak vs yok. Sabaha karşı 05.00'de
İstanbul'daydım ve 07.00 uçağı ile Konya'ya uçtum :) Durum böyle olunca hem
uykusuzluk (buna alışkınım aslında) hem de sadece uçakta verilen abuk sandwich
nedeniyle açlık (işte buna dayanamam!) nedeniyle performansımdan şüphe etmediğimi
söylesem yalan olur.
 Konya, Selçuk Üniversitesi
Aktivitede katkılarından dolayı sevgili MSP, Okan Öztürkmenoğlu'na
çok teşekkür ediyorum. Bereketine hayran kaldığım etli ekmek desteği ile tüm
günü ayakta geçirebilmeme büyük katkıları oldu :)
Tekrar görüşmek üzere ;)
Bugün TBD ve INETA işbirliğinde "4
Konu 4 Gün" ücretsiz eğitim serisinin son gününde de LINQ işleyerek
eğitim serisini bitirmiş olduk. Artık biraz klasikleşmiş olsa da emin olun
gerçekten "çok büyük zevk" aldığım günler yaşadım. Gerçekten hem pazar
günlerinin hakkını vererek "eğlendik" hem de bir çok şey öğrenerek bilgiyi
paylaştık.
 "4 Konu 4 Gün" eğitimi LINQ günü.
Aktiviteye katılan herkese onlarca teşekkür ediyorum buradan. Muhteşemdiniz
;)
Son iki gündür Isparta, Süleyman Demirel Üniversitesi'ndeydim.
İki gün boyunca Silverlight, WPF, ASP.NET 3.5 AJAX ve LINQ
konularına değindik. SDÜ zaten daha önce de öğrencilerinden bana gelen soru
mailleri ile beni şaşırtan bir üniversite olmuştu. Bu ziyaretimde de epey şaşkın
anlar yaşadım. Peki neye şaşırdım? SDÜ'de şu an Silverlight ve WPF konularında
bitirme projeleri hazırlayan kardeşlerimiz var. Daha çoğu üniversitede bu
konuların birer mistik ütopya olarak dolaştığını düşünürsek SDÜ öğrencileri
ciddi şanslı. Seminerler boyunca gelen sorular ortalamanın çok üstünde bir
seviyeye sahipti.
 Süleyman Demirel Üniversitesi, Isparta
Buradan özellikle SDÜ'den sevgili Eğitim Görevlisi dostum Mehmet
Albayrak'a ilgisi, misafirperverliği ve organizasyondaki katkısı için
çok teşekkür ediyorum. Ayrıca tabi ki güler yüzleri ve teknoloji aşkları ile
beni hem şaşırtan hem de sevindiren katılımcılara, SDÜ öğrencilerine de çok
teşekürler. Kısa zamanda yakaladığım ufak bir manzara fotoğrafı ile buradan
Ispartaya tekrar selamlar.
 Eğirdir Gölü Tepesi, Isparta
Ücretsiz eğitim konseptinde düzenlediğimiz INETA ve NETRON sponsorluğundaki
Silverlight 1.0 eğitimine gelen ve gelmeye devam eden büyük ilgi daha önce de
tahmin ettiğim bir durumdu. Bu konuda maalesef "talihli" olamayıp seçilemeyen
arkadaşlar haklı olarak sitemkar mailler gönderiyorlar. Emin olun bu tarz
aktivitelere devam edeceğiz, mekan sponsorları aramaya devam ediyorum.
Bundan yaklaşık bir ay kadar öncesinde sevgili Burcu Kutlu
ile temellerini attığımız bir diğer etkinliği bugün sizlere duyurmak istiyorum.
Bu sefer de INETA ve TBD Genç işbirliği ile
birer tam günlük dört farklı konuda bilgisayar başında eğitimler açıyoruz. "Bir
günlük eğitim mi olur?" derseniz aslında haklısınız ama en azından kendi
adıma düşündüğümde 3 saatlik seminerlerimden sonraki adım diyebilirim. Diğer
Silverlight eğitimini 3 gün olarak tasarlamıştık. Umarım yakında bu gibi
ücretsiz eğitimlerin sayısını arttıracağız. Bu seferlik dört konu, dört gün ;)
23 Mart - ASP.NET 3.5 AJAX
30 Mart - Silverlight
6 Nisan - Expression Blend ve WPF
13 Nisan - ASP.NET 3.5 ve LINQ
Eğitim saatleri her gün 10.00-18.00 arasında, eğitim yeri
TBD İstanbul (Ali Ruhi Sok. No:2, K.3, Hasanpaşa/ Kadıköy).
Kayıt için bu adresi kullanabilirsiniz;
http://www.tbdgenc.org/index.php?page=activityjoin&lang=tr&id=29
Buradan özellikle tekrar sevgili Burcu Kutlu'ya aktivitenin
organizasyonundaki yoğun emekleri için çok teşekkür ediyorum.
Dün verdiğim sözü tutmanın zamanı geldi. Sizlerle kodlarını paylaştığım
mini projenin içerisindeki önemli birkaç noktayı öne çekerek mini bir XLINQ ve VB
şovu yapmak istiyorum :) Üzgünüm C# cılar .Element veya
.Elements gibi metodlarla uğraşmak zorunda kalacaklar ve benim güzel
VB'mi bırakarak ek metotlar kullanmaya niyetim yok :) Ayrıca paylaştığım proje
de VB ile yazılmış durumda o nedenle bu yazı da full VB olacak.
(Sektörde benim kadar agresif C#'a saldıran yok :)
Allah sonumu hayır etsin:) Bu arada C#'ı severim yani ama herkes yerinde sağ
olsun ;))
Kodlara geçmeden önce gelin projenin kullandığı XML dosyalarının yapısına bir
göz atalım.
<?xml version="1.0" encoding="utf-8"?>
<Olay>
<Tag>223257</Tag>
<Icerik>1112567</Icerik>
<Katilimci>0</Katilimci>
<Katilan Adi="Ercan
Altuğ Yılmaz" Mail="hebele@gubele.com" Tel="0900900900:)" />
<Katilan Adi="İbrahim
Demir" Mail="hebele@gubele.com" Tel="0900900900" />
</Olay>
Projedeki her bir aktivite için aktivitenin TAG ozelliği ile
aynı isme sahip bir XML dosyası oluşturuluyor. Ayrıca TAG
bilgisi neden dosyanın içerisine de kaydetmişim bilmiyorum :) Şimdi kodumu
okurken saçma olduğunu gördüm. Neyse gece yarısı aceleyle herhangi bir planlama
olmadan kod yazılırsa böyle olur :) Yukarıdaki gibi yaratacağımız XML
dosyalarında Olay kök elementinin içerisinde Icerik
kısmına söz konusu aktivite ile ilgili açıklamaları içerecek olan HTML kodları
yerleştirilecek. Maksimum katılımcı sayısı Katilimci tagları
arasına yazılacak. Sonrasında aktiviteye kayıt olan herkesin bilgisi
Katilan taglarındaki gibi bu dosyaya eklenecek.
kayit.aspx
Bu dosyayı herhangi bir kaydı göstermek veya düzenlemek için kullanacağız.
Eğer bu dosyaya herhangi bir aktivitenin tag bilgisi adres üzerinden ?tag=aktivite
şeklinde aktarılmış ise söz konusu aktivitenin bilgileri gelecek ve sonrasında
değiştirilebilecek. Aksi halde yeni bir aktivite yaratılacak. Önemli olan
birinci nokta yeni bir aktivite için yeni bir XML dosyası yaratarak içerisine
gerekli bilgileri ekleyebilmek.
Dim Belge As New
XDocument
Dim root As New
XElement("Olay")
root.Add(New XElement("Tag", TextBox2.Text))
root.Add(New XElement("Icerik", TextBox1.Text))
root.Add(New XElement("Katilimci", TextBox3.Text))
Belge.Add(root)
Belge.Save(Server.MapPath("App_Data") & "\" & TextBox2.Text & ".xml")
Yukarıdaki kodda bir XDocument yaratarak içerisine XElement'ler ekliyoruz.
Elementleri eklerken isterseniz değerlerini de ikinci parametre olarak
verebiliyorsunuz. Son olarak da XDocument'ın Save metodu ile dosyayı
kaydediyoruz. Olay aslında bu kadar basit. Kullanıcının kutulara girdiği
metinleri herhangi bir kontrolden geçirmiyoruz, çünkü birincisi yönetim
panelindeyiz. Yani güvenli bir yerdeyiz, ikincisi bu projede buna zamanımız yok
:D Ama aklınızda olsun halka açık sitelerde böyle girişleri script
injection için kontrol etmek gerek.
Peki var olan bir dosyayı okuyup ekranda nasıl gösteririz?
Dim Belge = XDocument.Load(Server.MapPath("App_Data") & "\" & Request.QueryString("tag") & ".xml")
TextBox2.Text = Belge.<Olay>.<Tag>.Value
TextBox3.Text = Belge.<Olay>.<Katilimci>.Value
TextBox1.Text = Belge.<Olay>.<Icerik>.Value
GridView1.DataSource = From Gelenler In Belge.<Olay>.<Katilan> Select Gelenler.@Adi, Gelenler.@Mail, Gelenler.@Tel
GridView1.DataBind()
İlk satırda gördüğünüz üzere XDocument sınıfının
Load metodu ile dosyamızı okuyarak Belge değişkenine
aktarıyoruz. Bu noktada özellikle VB ile ilgili late-binding olayından bahsetmek
istiyorum. Dikkatinizi çektiyse Belge değişkenini tanımlarken herhangi bir
değişken tipi belirtmedim. Bu durum kod çalışırken run-time esnasında değişkenin
tipi belli olacak şeklinde çalışmıyor. Eğer böyle çalışsaydı yıllar önceki
VB'deki performans kaybını yaşamış olurduk. Tam tersine biz bu kodumuzda
Belge değişkeninin tipini belirtmesek de compiler bunu algılayarak
gerekli tanımlamaları yapacaktır. Zaten yukarıdaki manzarada bile Visual Studio
içerisinde Belge değişkeninin üzerine fare ile geldiğimizde
değişkenin tipinin algılandığını görebiliyoruz. Buradan yola çıkıp "hiçbir
değişkenin tipini tanımlamayın" diye bir şey söylemiyorum, bu büyük bir
hata olur fakat tipi belli bir şey için de uğraşmaya gerek yok :) (VB'cilerdeki
bu tembellik nedir ya :D)
GridView ile ilgili kısma geçerken bu Grid'in ne işe
yarayacağını baştan söyliyeyim. Tüm kolonları otomatik yaratılmak üzere ayarlanmış
bir Grid olarak bu arkadaşımızın görevi aktiviteye kayıt olanların bilgilerini
göstermek. Bunun için doğrudan Belge değişkenimize bir LINQ sorgusu göndererek
istediğimiz bilgileri kolonlar şeklinde alıyoruz. Ne kadar kolay değil mi?
default.aspx
Proje içerisinde değinmek istediğim bir diğer dosya da ana kayıt sayfası. Bu
sayfada ilk olarak söz konusu aktiviteye kayıt olan kişi sayısını bularak
maksimum sayının altında olup olmadığını kontrol etmemiz gerekiyor. Yani XML
dosyası içerisinde Katilan taglarını saymamız gerek.
If Belge.<Olay>.<Katilimci>.Value <=
Belge.<Olay>.<Katilan>.Count And Belge.<Olay>.<Katilimci>.Value <> 0 Then
Label1.Text = "Aktivite için maksimum kayıt sayısına ulaşıldı. Üzgünüz, bir dahakine."
kayittablo.Visible = False
Else
Belge değişkenimize XML dosyasını yükledikten sonra doğrudan Olay'ın
Katilimci değerinden maksimum katılımcı sayısını alabiliyoruz. O
ana kadar toplam kaç kişinin kayıt olduğunu, yani Katilan
taglarının sayısını da doğrudan Count metodu ile alabiliyoruz.
XLINQ cidden süper bir şey, eskiden ömür tüketirdi bu işler.
Dim Belge = XDocument.Load(Server.MapPath("App_Data") & "\" & Request.QueryString("event") & ".xml")
Belge.<Olay>.SingleOrDefault.Add(New XElement("Katilan",
New XAttribute("Adi", TextBox1.Text), New XAttribute("Mail", TextBox2.Text), New XAttribute("Tel", TextBox3.Text)))
Belge.Save(Server.MapPath("App_Data") & "\" & Request.QueryString("event") & ".xml")
Son olarak gelelim kayıt olan ziyaretçinin bilgilerini XML dosyasına
eklemeye. XML dosyasını okuyarak içerisinde Olay kök elementini
buluyoruz. Normalde elementler liste olarak döndürüldüğü için bizim bu listeyi
tek bir elemente çevirmemiz lazım. Olay elementinin zaten XML
dosyasında bir adet olabileceğini biz biliyoruz, çünkü kök element. O nedenle
Olay'ı yakaladıktan sonra .SingleOrDefault
diyerek bunu tek bir element olarak alıyoruz ve içerisine Katilan
elementi ekliyoruz. Katilan elementini XElement
olarak yaratırken birinci parametrede elementin adını verdikten sonra
istediğiniz kadar başka XElement'ler veya
XAttribute'ler ekleyebilirsiniz. Bizde katılımcının adı, telefonu ve
maili yeterli olacak. Son olarak dosyayı diske kaydediyoruz.
XLINQ ile XML uygulamaları "bebelere balon" kıvamında!
Eski günlerde olsak yukarıdaki işlemleri yapabilmek için XSLT, XPATH bilmenin
yanı sıra bolca da XML okuma ve yazma için kod yazmanız gerekirdi. Oysa bugün iş
gerçekten çocuk oyuncağı da olmanın ötesinde "bebelere balon" kıvamına gelmiş
durumda. Umarım bu projeyi sizlerle paylaşmam XLINQ'nun kullanımı ile ilgili
ufak da olsa bir fikir verip bu dünyaya giriş yapmanıza yardımcı olur.
Hepinize kolay gelsin.
Ücretsiz 24 saatlik Silverlight eğitimi ile ilgili duyuru içerisindeki kayıt
formunu görmüşsünüzdür. Maalesef bu form sistemini yapmamı bekleyerek duyuruyu
üç gün kadar geç yapabildik :) Bu aralarda ciddi çok yoğun.
Peki böyle bir formu yapmak ne kadar sürebilir ki? Ortalama 15 dakikamı aldı,
ama sadece bir mailform değil :) Hazır yapmışken ileriki aktiviteler için de
kullanabileceğim bir sistem yapmak istedim. Hedefim mini-iğrenç :) bir yönetim
panelinden en azından aktivite yaratıp kapatabilmekti, tabi kayıt olan kişilerin listesini de alabilmem gerekiyordu. Neden iğrenç dediğimi de
açıklıyım. Sadece ben kullanacağım için yönetim panelinin güzelliği ile vs hiç
mi hiç uğraşmadım :) iş görsün yeter.
Konuyu uzatmadan, bütün bunları neden size anlattığımı da söylemekte fayda
var. Hazırlamış olduğum sistemi tüm kodları ile sizlerle paylaşmaya karar
verdim. Evet, birazdan indirebileceksiniz :)
Sistem aslında çok basit bir mantıkla çalışıyor. Yönetim panelinden bir
aktivite yaratıyorsunuz aktiviteye verdiğiniz TAG özelliği o aktivitenin kodu
oluyor. Bu kod üzerinden default.aspx?event=kod gibi adreslerle insanlar bu
aktivitelere kayıt olabiliyorlar. Her bir aktivitenin kodu, aciklamasi ve
maksimum katılımcı sınırı var. Aciklama kısmı aktivite ile ilgili sayfadaki kayıt
formunun üzerindeki HTML kısmı içeriyor. Makimum katılımcıyı isterseniz 0 vererek
sınırsız hale getirebiliyorsunuz. Her bir aktivite ile ilgili tüm bilgiler ayrı
ayrı XML dosyalarında App_data klasöründe saklanıyor.
Uyarılar
Arkadaşlar birazdan projenin kodlarını indirip incelerken bu
projeyi bir gece yarısı saat 01.00 ile 01.15 arasında yaptığımı aklınızın bir
köşesinde bulundurun :) Hatta bu projeyi paylaşıyorum diye içerisinde herhangi
bir değişiklik vs de yapmadım. Yalan olmasın login.aspx deki şifreyi
değiştirdim. O nedenle aşağıda bahsettiğim noktalarla ilgili bu projeyi örnek
almayın!
Bunları örnek almayın!
-Authentication yapısı rezalet. Zaten login.aspx de kullanıcı adı bile yok,
sadece şifre soruyor :) Şifreyi sorduğu metin kutusunun tipi bile Password değil
:) Bir ara düzeltmek lazım. Forms Authentication kurmaya üşendim.
-XML dosyalarının okunması ve yazılması arasında aslında application.lock
kullanmak lazım. Aynı salisede 2 kişi formu göndermeye kalkarsa biri karambole
gidecektir. Allahtan bizde pek böyle bir ihtimal yok gibi :) (Umarım)
İncelenmesi gereken kısımlar (Projenin kodunu
paylaşmaktaki amacım)
XLINQ ile yazılmış kısımlara özellikle dikkat etmenizde fayda var. XML
dosyalarının yaratılmasındaki kolaylık, okunmasındaki rahatlık özellikle dikkat
çekici. Bu kodu sizlerle paylaşmanın birinci nedeni XLINQ örneği olarak
incelemeniz ikincisi ise böyle bir mini sisteme ihtiyacı olan varsa alsın rahat
rahat kullansın :)
LINQ'den bahsettiğimize göre unutmamak gerek ki bu site ASP.NET 3.5 ile
hazırlanmıştır. Projedeki bazı kodlarla ilgili yarın bazı açıklamalar da
yayınlayacağım.
Hepinize kolay gelsin. Aktivite Kayıt Sistemi Kaynak Kodları - 28022008_1.zip (7.5 KB)
PCnet'in Şubat sayısındaki yazılarımı her ay olduğu gibi yine buradan sizlere duyurmak
istiyorum :) Derginin
OKUL bölümünde AJAX, ASP.NET 3.5,
Expression Blend ve Silverlight ile ilgili yazılarım yer alıyor.
AJAX : Zaman doluyor, AJAX istekleri yolda.
Expression Blend : WPF Uygulamalarında internette
Silverlight: Silverlight ve JavaScript
ASP.NET 3.5 : ASp.NET 3.5 ve LINQ2SQL Tüm bu yazılara ek olarak
Şubat sayısına özel ".NET Framework 3.5'in Yıldızı: LINQ"
makalem de OKUL bölümünde yer alıyor :)
Hepinize kolay gelsin.
Daha önceki yazılarımda sadece VB'de çalışan ve benim "inline XML"
diyebileceğim VB kodları içerisinde doğrudan XML yazımının kullanılmasından
bahsetmiştim. İşin kötü tarafında bu noktada Visual Studio'nun Intellisense
desteği maalesef bizim hedef XML'in içeriğini inceleyerek otomatik bir
Intellisense oluşturamıyor. "Çok şey istiyorsunuz!" dediğinizi duyar gibiyim ama
benim gibi çok isteyen olmuş ki Visual Basic 2008 için özel "XML to Schema Tool for Visual Basic 2008"
üretilmiş. Aşağıdaki adresten aracı bilgisayarınıza indirerek hemen
yükleyebilirsiniz. (LINQ2XML kullanacaklara ŞİDDETLE tavsiye ediyorum :))
http://www.microsoft.com/downloads/details.aspx?FamilyID=9ac5a653-563a-4204-a4eb-dddcae80b244&displaylang=en
LINQ2XML ile XML dosyaları üzerinde çalışmak gerçekten kolaylaştı. Üzerine
bir de VB'nin kolaylıkları ve yukarıdaki araç eklenince iş gerçekten çocuk
oyuncağına dönüşüyor.
Nasıl kullanacağız?
Herhangi bir proje yarattıktan sonra doğrudan "Solution Explorer" içerisinde
projeye sağ tuş ile tıkladıktan sonra "Add / New Item" diyerek karşınıza gelen
menüden "XML to Schema" seçeneğini seçebilirsiniz.
 XML to Schema dosyası.
Dosyası eklediğiniz anda karşınıza bir seçenek daha gelecek. Bu seçenekler
arasında hedeflediğiniz, yani kullanacağınız esas XML dosyasının konumu
soruluyor. İsterseniz "Add from File" ile sisteminizdeki bir
dosyayı veya "Add from Web" ile doğrudan internetteki bir
dosyayı veya "Add as XML" ile kullanacağınız XML verisini
Visual Studio içerisinde yazabilirsiniz. Biz örneğimizde her zamanki gibi TCMB
döviz kurlarını alalım.
 TCMB döviz kurlarını alıyoruz.
XSD dosyasını bu şekliyle projemize ekledikten sonra artık sıra geldi
kodumuzu yazmaya. Artık bir önceki adımda eklediğimiz XML dosyasının içeriğinden
oluşturulan Intellisense'i kullanabiliriz.
 LINQ2XML Intellisense desteği.
Hepinize kolay gelsin ;)
Özellikle uzun metinleri hazırladığımız kodun içerisine gömmek istediğimizde
satır atlamaları vs epey can sıkıcı bir hal alıyor. Bu nedenle çoğu zaman bu
metinleri harici bir TXT dosyasına koyarak oradan çekmeyi tercih ediyorum. Oysa
yeri geldiğinde bir ASP.NET web sayfasında minik bir HTML kodunu veya Winforms
uygulamasında çok satırlı bir uyarı mesajını rahatlıkla kodun içerisine
koyabilsek ne kadar hoş olurdu değil mi?
"Koyarız zaten" dediğinizi duyar gibiyim. Gelin eskiden nasıl koyduğumuza
ufak bir örnek ile bakalım.
Dim UyarıMesaji As String = "Bu ""ÖZEL"" bir uyarı" & vbCrLf & "mesajıdır."
Eğer içeri alacağınız metin çok uzunsa aslında bir de kodun okunabilirliği
adına kod içerisinde de satır atlayarak yazmak isteyebilirsiniz. Bu durumda da
takriben aşağıdaki gibi bir manzara ortaya çıkacaktır.
Dim UyarıMesaji As String = "Bu ""ÖZEL"" bir uyarı" _
& vbCrLf & "mesajıdır."
Peki bu kadar sorunlardan bahsettik de çözümü nedir? Çözüm .NET Framework 3.5
ile beraber gelen XLINQ sınıflarında yatıyor :)
Dim UyarıMesaji As XElement = <Mesaj>Bu "Özel" bir uyarı
mesajıdır.</Mesaj>
Console.Write(UyarıMesaji.Value)
İşte artık istediğiniz gibi metinlerinizi bir XElement olarak kod içerisine
yerleştirebilir sonra da söz konusu XElement'in value metodu ile metni
alabilirsiniz. Hatta daha da güzel kullanım şekilleri var.
Dim
UyarıNo As Integer = 7893
Dim UyarıMesaji As XElement = <Mesaj>Bu "Özel" bir uyarı
mesajıdır.
Uyarı numarası:<%=
UyarıNo %></Mesaj>
Yukarıdaki kod içerisinde yarattığımız metne bir değişkeni de metin olarak
ekliyoruz. Bu teknik özellikle bir metnin içerisine çok sayıda farklı parametre
eklenecek işimizi epey kolaylaştıracaktır. Gelin bir de birden çok uyarı
numarasının bulunabileceği bir örnek yapalım.
Dim UyarıNo() As Integer = {7893, 7777}
Dim UyarıMesaji As XElement = <Mesaj>Bu "Özel" bir uyarı
mesajıdır.
<%= From
Uyarilar In UyarıNo Select <Uyari>
Uyarı numarası:<%=
Uyarilar %></Uyari>.Value %></Mesaj>
Yukarıdaki kod kafanızı karıştırabilir. Belki biraz eski ASP günlerine dönmek
anlamanıza yardımcı olabilir. İlk olarak UyarıNo adında bir
diziye toplam iki adet uyarı numarası ekledim. Uyarı mesajımı yaratırken bu
dizinin içerisinde her bir uyarı numarasını mesajın sonuna yazdırmak istiyorum.
Mesajı XElement olarak oluştururken içine bir LINQ sorgusu
yerleştiriyorum. LINQ sorgusu geriye yine bir XElement
yaratarak söz konusu elementin Value'sunu döndürüyor. LINQ
sorgusu dizi içerisinde gezerek her bir kayıt için gerekli metni yaratarak toplu
olarak döndürecektir.
Gördüğünüz gibi VB 9.0 ile beraber çok ilginç yenilikler
geliyor. Daha da güzeli :) bunlar maalesef C# tarafında yok :)
Hepinize kolay gelsin.
2008'in ilk aktivitesini
CETURK.com organizasyonunda Microsoft, İstanbul / Dikilitaş binasında
gerçekleştiriyoruz. "2008 Microsoft Vizyonu ve Yeni Teknolojileri
Semineri" olarak adlandırdığımız güne hepiniz davetlisiniz :)
12 Ocak, Cumartesi günü sabah 10'dan başlayarak
17.30'a kadar sürecek olan seminerlerin konuları arasında
Expression Web, Design, Blend, Silverlight, Visual Studio 2008, LINQ
bulunuyor. Expression Blend ile WPF Animasyonları ve
Silverlight 1.0, 2.0 Uygulamaları bölümünü 12.30-14.30
arasında ben sunuyor olacağım.
Programın detayları ve seminere kayıt için aşağıdaki linki kullanabilirsiniz.
http://www.ceturk.com/etkinlikkayit.asp?id=35
LINQ ile veritabanına sorgu göndererek istediğimiz verileri
alabileceğimiz örneklere blogumda eski yazılarımda bolca yer verdim. Fakat
aslında LINQ sadece veritabanından veri çekmek için değil yeri geldiğinde
veritabanına veri göndermek, yani INSERT, UPDATE ve DELETE işlemleri için de
rahatlıkla kullanılabilir.
Aşağıdaki şekliyle bir DBML dosyamız ve tabi ki bir de buna bağlı
veritabanımız olduğunu varsayalım.
 Örneğimizdeki DBML dosyamızın yapısı.
Şimdi gelin bu veritabanından bir satırı LINQ ile veritabanından çekerek
içerisinde bir UPDATE işlemi yapalım.
Partial Class _Default
Inherits System.Web.UI.Page
Dim MyData As New DataClassesDataContext
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x As AnaBolumler = (From MyTable In MyData.AnaBolumlers Select MyTable Take 1).SingleOrDefault
x.AnaName = "Ahmet"
MyData.SubmitChanges()
End Sub
End Class
Yukarıdaki kod örneğinizde AnaBolumler adında bir değişken
yaratarak veritabanından tek bir kayıt almak için de LINQ deyiminde Take
1 kısmını kullanıyoruz. Siz kendi örneklerinizde isterseniz PK
üzerinden sorgular da düzenleyebilirsiniz. Yukarıdaki gibi bir LINQ sorgusu
geriye bir dizi döndüreceği için tek bir nesneye eşitleme şansımız olmaz. O
nedenle sorgunun geriye sadece tek bir nesne döndürebilmesi için ayrıca
SingleOrDefault deyimini de kullanmamız gerekiyor. Aldığımız nesnenin
herhangi bir özelliğini istediğimiz gibi değiştirdikten sonra artık geriye kalan
DataContext üzerinden SubmitChanges metodunu
çağırarak değişikliklerin veritabanına yansıtılmasını sağlamak.
Şimdi bir de INSERT işlemi yapalım.
Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
Dim x As New AnaBolumler
x.AnaName = "Ahmet2"
MyData.AnaBolumlers.InsertOnSubmit(x)
MyData.SubmitChanges()
End Sub
Kod içerisinde veritabanına gönderilmek üzere yeni bir AnaBolumler
nesnesi yaratarak nesnenin tüm özelliklerini belirliyoruz. Sonrasında
DataContext nesnemiz olan MyData üzerinden
AnaBolumlers tablosunun INSERT edilecek satırlar listesine
InsertOnSubmit metodu ile satırımızı ekliyoruz. Tüm bu işlemleri
tamamladıktan sonra DataContext'in SubmitChanges metodu ile
değişikliklerin, yani bu örnekte yeni eklenen satırların veritabanına
aktarılmasını sağlıyoruz.
Son olarak bir DELETE yapmanın yoluna göz atalım.
Protected Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim x As AnaBolumler = (From MyTable In MyData.AnaBolumlers Select MyTable Take 1).SingleOrDefault
MyData.AnaBolumlers.DeleteOnSubmit(x)
MyData.SubmitChanges()
End Sub
Yukarıdaki kod içerisinde yarattığımız X adındaki
AnaBolumler nesnesine veritabanından silmek istediğimiz nesneyi bir
LINQ sorgusu ile aktarıyoruz. Sonraki satırda DataContext
içerisinde AnaBolumler tablosunun silinecek kayırlar listesine
elimizdeki X değişkenini DeleteOnSubmit metodu
ile ekliyoruz. En sonunda da yine DataContext'in SubmitChanges
metodu ile değişikliklerin veritabanına yansımasını sağlıyoruz.
İşte LINQ ile veritabanında kayıtlar üzerinde değişiklik yapmak bu kadar
kolay.
Yeni yılın bu ilk yazısında hepinize tekrar sağlıklı ve mutlu bir yıl
diliyorum.
Dün mail ile WPF ve LINQ'nun beraber kullanılıp kullanılamayacağı ile ilgili
güzel bir soru geldi. Ben bu soruyu hemen ufak bir blog yazısına çevirerek
bilgiyi buradan sizlerle de paylaşmak istiyorum. WPF ile LINQ'nun beraber
kullanılabilmesi aslında WPF'in .NET Framework 3.5 ile
kullanılabilmesine bağlı. WPF esasen .NET Framework
3.0'ın bir parçasıdır fakat tabi ki .NET Framework 3.5 ile beraber de
kullanılabiliyor hatta 3.5'in 3.0 üzerine geldiğini düşünürsek aslında WPF
3.5'in de bir parçası. Peki nasıl olacak da bir WPF uygulamasını .NET Framework
3.5 ile çalışır hale yaratacağız. Aslında cevap pek zor değil, doğrudan Visual
Studio 2008 kullanabilirsiniz. Tek yapmanız gereken Visual Studio 2008'in
Multi-Targeting
özelliğinden faydalanarak .NET Framework 3.5'i seçmek.
 Visual Studio 2008 içerisinde .NET Framework 3.5 ile WPF Projesi
Aslında esas sorun Expression Blend tarafında. Expression Blend içerisinde
yeni bir WPF projesi oluşturmak isterseniz projeniz otomatik olarak .NET
Framework 3.0'ı hedefleyecektir. Bunun nedeni Expression Blend'in .NET Framework
3.5'ten önce yayınlanmış olması. Bu sorunu şimdilik çözmek için Expression Blend
2 December Preview kullanabilirsiniz.
 Expression Blend 2 December Preview içerisinde .NET Framework 3.5 desteği.
Yukarıda Expression Blend 2'nin proje yaratma penceresinde farklı Framework
sürümlerini seçebiliyorsunuz. Tabi tüm bunlara ek olarak unutmamak gerek ki
projenizi .NET Framework 3.5 desteği ile Visual Studio 2008 içerisinde
yarattıktan sonra Expression Blend'in yayında olan sürümüyle de söz konusu
projeyi açarak düzenleyebilirsiniz. Sorun sadece yeni proje yaratırken karşımıza
çıkıyor.
.NET Framework 3.5 ile bir WPF uygulaması yaratırken tüm .NET Framework 3.5
projelerinde olduğu gibi WPF ile de LINQ'yu rahatlıkla kullanabilirsiniz.
Hepinize mutlu yıllar :)
LINQ'nun güzellikleri serime devam etmek istiyorum :) .NET Framework3.5
ile gerçek hayat projeleri yapabileceğimiz bu dönemde LINQ'nun proje süreçlerini
ciddi şekilde hızlandırdığı kesin. Daha önceki yazılarımda kabaca LINQ2XML'den
bahsetmiştim. XML verilerini LINQ ile sorgulayarak istediğimiz verileri
alabiliyor olmak önceki muadilleri olan XMLReader'a ve XPATH'e kıyasla çok daha
kolay kullanılabilir bir arayüz sağlıyor.
Konuya hemen çok popüler bir örnek ile giriş yapmak istiyorum. TCMB web
sitesinden güncel döviz kurlarını çekmek neredeyse her yazılım geliştiricinin
deneyim ettiği bir işlemdir. Bu işlem için için eskiden en kolay yol olarak bir
dataset yaratıp dataset'e ait ReadXML metodunu kullanıyorduk. Aslında sadece bir
döviz kuru okumak için DataSet iki complex bir nesne yaratıyor olmak ciddi
anlamda sistem kaynaklarının boşa harcanması demektir ama kimin umrunda? :)
Profesyonel yol ise XMLReader ile XPATH kullanarak uygun veriyi almak.
Peki artık LINQ varsa ve biz LINQ ile XML verilerini de sorgulayabileceksek
aşağıdaki kod yeterli olmak mı?
Dim doc = XDocument.Load("http://www.tcmb.gov.tr/kurlar/today.xml")
Response.Write(doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<CurrencyName>.Value = "US DOLLAR").<ForexBuying>.Value)
Yukarıdaki kod içerisinde ilk olarak bir System.XML.Linq.XDocument
nesnesi yaratıyoruz. Dokümanımız direk web sitesinden XML belgesini okuyor. Bir
sonraki satırda ise direk LINQ2XML kullanarak verimizi
buluyoruz. Son satırı biraz parçalayarak inceleyelim.
doc.<Tarih_Date>.<Currency>
Bu kod ile hedef doküman içerisindeki XML taglarını gezerek Tarih_Date
tagları içerisinde bulunan tüm Currency taglarının bir
listesini alıyoruz. Bu listeyi aldıktan sonra LINQ Extension Method'larından
Where'i kullanarak bir sorgu çalıştırıyoruz.
doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<CurrencyName>.Value = "US DOLLAR")
Buradaki Where methodu bizden bir karşılaştırma fonksiyonu
istiyor. Söz konusu fonksiyon karşılaştırmak için gelen veriyi parametre olarak
alıyor. Biz Currency tagını listelediğimizde göre her bir
Currency içerisinde CurrencyName üzerinden
verimizi filtreliyoruz ve sadece CurrencyName'i "US DOLLAR"
olan satırı Currency'i istiyoruz.
Filtreleme işlemini yaptıktan sonra hala elimizde filtremize uyan bir
Currency elementi listesi var. Bize tek bir Currency
döneceğini bildiğimiz için direk söz konusu Currency'nin bu
sefer de ForexBuying elementini yakalayarak içerisinde değeri
almak için de Value metodunu kullanıyoruz.
doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<CurrencyName>.Value = "US DOLLAR").<ForexBuying>.Value
Böylece artık elimizde dolar kuru var. Bu şekilde herhangi bir XML dokümanı
içerisinde gezmek gerçekten çok kolay. Gelin aynı XML dokümanı içerisinde farklı
bir sorgu çalıştıralım. Curreny listesi içerisinde Isim değerinde "I" harfi
bulunan kayıtların CurrencyName'lerini listeletelim.
Dim doc = XDocument.Load("http://www.tcmb.gov.tr/kurlar/today.xml")
For Each kur In doc.<Tarih_Date>.<Currency>.Where(Function(x) x.<Isim>.Value.Contains("I"))
Response.Write(kur.<CurrencyName>.Value)
Next
Yukarıda da gördüğünüz gibi XDocument üzerinden sorgumu
oluşturduktan sonra direk bir For Each döngüsüne kaynak olarak
veriyorum. Döngü içerisinde de bir Currency elementi olan kur
değişkeninin CurrencyName değerini alarak ekrana yazdırıyorum.
Anlayacağınız artık XPath bilgisi olmadan rahatlıkla XML kaynaklarını
sorgulamanız mümkün.
Hepinize kolay gelsin.
Bir süredir okuduğum yazılarda ve konuştuğum kişilerde LINQ
denildiğinde akla sadece veritabanına kolay yoldan sorgu yollama gibi bir
kavramın geldiğini gördüm. O nedenle bu yazımda birkaç örnek ile aslında
LINQ'nun çok daha farklı durumlarda kullanılabileceğini ve işimizi
veritabanından bağımsız olarak da kolaylaştırabileceğini göstermek istiyorum.
Birinci örneğimizde içerisinde birden çok TextBox ve birçok farklı control
bulunan bir web sayfamız bulunsun. Varsayalım ki biz bu sayfadaki tüm
TextBox'ların bir anda Enabled özelliklerinin False olmasını istiyoruz. Bu
durumda yazacağımız kod aşağıdaki gibi olacaktır.
For Each kontrol In Me.Form.Controls
If TypeOf kontrol Is TextBox Then
CType(kontrol, TextBox).Enabled = False
End If
Next
Oysa LINQ kullanarak bu işi çok daha hoş bir hale getirebiliriz. Yukarıdaki
döngüde sayfadaki tüm kontrolleri dönmemiz gerekirken LINQ ile sayfadaki
kontrolleri filtreleterek döngümüzün kaynağına sadece TextBox listesinin
gelmesini sağlayabiliriz.
For Each kontrol As TextBox In From Gelenler In Me.Form.Controls Where TypeOf Gelenler Is TextBox Select Gelenler
kontrol.Enabled = False
Next
Gördüğünüz gibi hayat aslında çok daha kolay ve LINQ yeri geldiğinde çok
farklı kaynakları sorgulamaya bile yarıyabiliyor. Gelin bir örnek daha yapalım.
Çoğu zaman hazırladığımız web sitelerine kullanıcıların dosya yükleme veya
resim yükleme gibi işlemler yapabilecekler kısımlar ekleriz. Tabi ki bu dosyalar
yüklendikten sonra bir yerlerde de gösterilmek üzere seçilmelidir. Hikayeyi daha
fazla uzatmadan esas konuya geleyim. Varsayalım ki bir klasör içerisinde tüm
dosyaları bir DropDownList kontrolüne bağlayacağız. Dosyaların isimlerinin
kullanıcıya gösterilmesini tam yol bilgisinin ise DropDownList'e ait Value
özelliklerinde saklanmasını istiyoruz. Yazacağımız kod aşağıdaki gibi olacaktır.
Partial Class _Default
Inherits System.Web.UI.Page
Class DropSatir
Private P_Dosya As String
Private P_Path As String
Property Dosya() As String
Get
Return P_Dosya
End Get
Set(ByVal value As String)
P_Dosya = value
End Set
End Property
Property Path() As String
Get
Return P_Path
End Get
Set(ByVal value As String)
P_Path = value
End Set
End Property
Sub New()
End Sub
Sub New(ByVal Dosya As String, ByVal Path As String)
P_Dosya = Dosya
P_Path = Path
End Sub
End Class
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim DosyaListesi As New System.Collections.Generic.List(Of DropSatir)
For Each dosya As String In System.IO.Directory.GetFiles(Server.MapPath("."))
DosyaListesi.Add(New DropSatir(System.IO.Path.GetFileName(dosya), dosya))
Next
DropDownList1.DataSource = DosyaListesi
DropDownList1.DataTextField = "Dosya"
DropDownList1.DataValueField = "Path"
DropDownList1.DataBind()
End Sub
End Class
Bir DropDownList doldurmak için bu kadar kod çok değil mi? diyorsanız aslında
yapacak pek de bir şey yok :) Tek tek direk döngü içerisinde ListItem'lar
yaratarak DropDownList'e ekleyebilirdik. O zaman da kodumuz aşağıdaki şekilde
olurdu. Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
For Each dosya As String In System.IO.Directory.GetFiles(Server.MapPath("."))
DropDownList1.Items.Add(New ListItem(System.IO.Path.GetFileName(dosya), dosya))
Next
End Sub
Çok daha kısa değil mi? :) Ama bu durumda DropDownList'in DataBound event'ı
çalışmayacaktır. Biz dönelim bir de bu işlemi LINQ kullanarak nasıl yapabiliriz
ona bakalım.
DropDownList1.DataSource = From Dosyalar In System.IO.Directory.GetFiles(Server.MapPath(".")) Select Dosya = System.IO.Path.GetFileName(Dosyalar), Dosyalar
DropDownList1.DataTextField = "Dosya"
DropDownList1.DataValueField = "Dosyalar"
DropDownList1.DataBind()
Gördüğünüz gibi olay çok daha basit bir hal alıyor. LINQ içerisinde
System.IO.Directory.GetFiles'dan gelen veriye bir sorgu gönderiyoruz.
Sorgumuzu alırken Dosya adında bir kolon tanımlayarak onu da
System.IO.Path.GetFileName metodundan gelen veriye eşitliyoruz.
Böylece istediğimiz veriler ayrı ayrı kolonlar olarak bize döndürülüyor ve
doğrudan DropDownList kontrolümüze bağlayabiliyoruz.
Artık sanırım LINQ ile ilgili çok daha farklı düşünceleriniz vardır :)
Hepinize kolay gelsin.
Blogumu sürekli takip edenler hatırlayacaklardır, bundan yaklaşık bir ay
kadar önce LINQ'den ufak bir yazıyla bahsetmiştim ve daha VS 2008 çıkmadığı için
biraz daha sabretmemiz gerektiğini belirtmiştim. Artık elimizde VS 2008
bulunduğuna göre LINQ'yu yavaş yavaş biraz daha incelemekte fayda var. Emin olun
çok şaşıracaksınız.
Bu yazım boyunca Visual Web Developer 2008 Express
kullanacağım. Yeni bir ASP.NET 3.5 web sitesi yaratarak
başlayalım. Örnek boyunca ben kendi makinemde kurulu SQL2005 üzerindeki "forum"
adındaki bir veritabanından faydalanacağım. Veritabanımın yapısını aşağıdaki
şema içerisinde inceleyebilirsiniz.
 Örnek veritabanı tasarımı.
Bu veritabanı üzerinden yola çıkarak ASP.NET 3.5 sitemde LINQ2SQL kullanarak
veriye ulaşmaya çalışacağım. İlk olarak projemize bir "LINQ2SQL Class"
dosyası eklememiz gerekiyor. Bunun için hemen "Solution Explorer"
içerisinde projeye sağ tuş tıklayarak "New Item" demeniz
yeterli.
 Yeni bir DBML dosyası yaratıyoruz.
Dosyayı projenize eklediğiniz gibi karşınıza farklı bir arayüz gelecektir.
Bir sonraki adımda Visual Studio içerisinde "Database Explorer"
panelinden SQL sunucunuza ve veritabanınıza bağlanmanız gerekiyor. Aslında işin
bu bölümü Visual Studio 2005'den pek farklı değil. Bağlantıyı sağladıktan sonra
veritabanınızdaki istediğiniz tabloları sürükle&bırak tekniği ile orta
pencereye, yani DBML dosyasına aktarabilirsiniz.
 Veritabanından DBML dosyasına yolculuk.
Artık DBML dosyası kaydederek çıkabiliriz. Eğer isterseniz tabloların yanı
sıra Store Procedure'lerinizi de DBML dosyalarına ekleme şansınız var. Peki "ekledik
de ne oldu?" diyenlerdenseniz buyurun devam edelin.
Projemize ait default.aspx dosyasının Code-Behind sayfasına
geçerek kodumuzu yazmaya başlayalım.
Dim datalarim As New DataClassesDataContext
Yukarıdaki satır ile tanımladığımız değişkenimizin bizim DBML dosyamızdaki
LINQ nesnelerine ulaşmamızı sağlayacak böylelikle kolayca veritabanından istekte
bulunabileceğiniz. Gelin hemen aşağıdaki kodumuz ile bakalım nasıl veri
çekeceğiz.
Dim SeciliMesajlar = From Secililer In datalarim.Mesajlars Where Secililer.MesajText.Contains("DARON")
LINQ'yu ilk olarak görenler için yukarıdaki kodun ne kadar garip gözüktüğünün
farkındayım :) İlk olarak yarattığımız değişkene bir bakalım.
SeciliMesajlar adında bir değişken yaratarak LINQ sorguma eşitliyorum.
Aslında yarattığım SeciliMesajlar değişkeninin tipi
System.LINQ.IQueryable(of Mesajlar) şeklinde. Yani özetle bana Mesajlar
nesnesinin bir listesinden oluşan ve LINQ ile sorgu gönderebileceğim bir yapı
döndürülecek. From dedikten sonra tamamen "kafadan sallama"
bir tablo adı tanımlıyorum. Bunu SQL sorgularındaki tablolar gibi
düşünebilirsiniz. Geçici bir süre için sadece sorgumda kullanılmak üzere bir
tablo adı yaratıyorum. Bu tablonun bir önceki satırda yarattığım
datalarim veri katmanından Mesajlar tablosundan veri
alacağını belirtmek için In deyimini kullanıyorum. Bundan
sonrası aslında artık SQL sorguların çok benziyor. Where
deyimini kullanarak "kafadan sallama" olarak yarattığım tablonun
MesajText kolonunda "DARON" metni geçenlerin geri
döndürülmesini sağlamak üzere LINQ sorgumu düzenliyorum.
Bu sorgudan geri dönen SeciliMesajlar değişkenini direk
DataSource olarak kullanabilirsiniz. Eğer sayfanıza bir
GridView eklerseniz aşağıdaki gibi DataBind yapma
şansınız olacaktır.
GridView1.DataSource = SeciliMesajlar
GridView1.DataBind()
Gördüğünüz gibi veritabanına erişim bu kadar kolaylaşmış durumda. Aslında
eski günlere döndüğümüzde LINQ2SQL'in yaptığı işi yapan harici araçlar
kullanarak veritabanlarına göre otomatik şablonlar hazırlayarak şablonlar
üzerinden veri katmanı kodları yaratıyorduk. Tabi hiçbiri LINQ'nun getirdiği
esnekliğe sahip olmuyordu ama konsept olarak aynı amaca hitap ettiklerini
söyleyebiliriz.
Peki arkaplanda neler oluyor?
İş bu kadar kolaylaşmışken hemen akla "Performans???" sorusu geliyor
:) Acaba bu sorgular direk SQL'de mi çalışıyor yoksa GridView'ın Paging
özelliği gibi :) ASP.NET tüm veriyi SQL'den IIS'e alıp orada mı sorguluyor? Bu
soruya cevap bulmak için SQL Management Studio'yu açarak Activity
Monitor üzerinden sunucuya gönderilen sorgulardan birini yakaladım.
(@p0 nvarchar(7))
SELECT [t0].[MesajID], [t0].[MesajText], [t0].[MesajDate],
[t0].[LoginID], [t0].[KonuID], [t0].[IsHTML]
FROM [dbo].[Mesajlar] AS [t0]
WHERE [t0].[MesajText] LIKE @p0
Yazdığımız LINQ kodu yukarıdaki SQL koduna çevrilerek SQL sunucusuna
gönderilmiş. Gerçekten muhteşem :) Gerekli parametre tanımlanmış doğru sorgu
oluşturulmuş ve birleştirilmiş. Bunun üstüne söyleyecek söz yok.
Sanırım artık SQL tarafında sorguları hazırlayıp projelerimi kopyala-yapıştır
yapmaktan kurtulacağız :) Tabi daha LINQ ile ilgili anlatacak çok şey var.
İleriki yazılarda daha derinlere dalmak ümidiyle.
Hepinize kolay gelsin.
.NET Framework sürümleri arasında farklar zaten hali hazırda karıştırılırken
bir de üzerinde .NET Framework 3.5 gelecekken aşağıdaki görseli birazdan
bahsedeceğim bir Microsoft posterinde yakaladım. Bence herşeyi açıklıyor.
 .NET Framework sürümleriyle gelen yeni özellikler.
.NET Framework 3.0 ile beraber zaten tanıdığımız 2.0 sürümüne WPF, WCF, WF ve
CardSpace eklendi. Önümüzde bizi bekleyen 3.5 sürümü de tüm bunların üzerinde
LINQ, AJAX ve REST ile beraber geliyor. Bu konularda zaten daha önce makaleler
yazmıştım.
Son olarak yukarıdaki görseli bulduğum Microsoft posterini de sizlerle
paylaşmak istiyorum. Aşağıdaki adresten indirebileceğiniz posterde .NET
Framework 3.5 ile beraber sıkça kullanılması olası NameSpace'lerin bir listesi
ve hangi NameSpace'in hangi platformda desteklendiğine dair bilgiler bulunuyor.
Eğer olanağınız varsa bir dijital baskı merkezinden 50*70cm bastırarak
duvarınızı süsleyebilirsiniz :)
http://download.microsoft.com/download/4/a/3/4a3c7c55-84ab-4588-84a4-f96424a7d82d/NET35_Namespaces_Poster_LORES.pdf
Son zamanlarda özellikle Silverlight, WPF
ve Expression Studio ürün ailesi ile ilgili sizleri blogum ve
webinerler aracılığı ile bilgi bombardımanına tuttuğumun farkındayım :) Ama
aslında her şey bu kadarla bitmiyor. Visual Studio 2008, Windows Server
2008, SQL 2008, ASP.NET 3.5 gibi daha bir sürü yeni ürün ve teknolojiye
her gün biraz daha yaklaşıyoruz. Ben bu yazımda özellikle LINQ'dan
bahsetmek istiyorum. Bunun nedeni bence Visual Studio 2008 ile beraber gelen en
önemli ve bize bir o kadar da yabancı olacak konulardan biri olması.
LINQ (Language Integrated Query)
Query dediğimizde aklımıza hemen SQL gelir, yani veritabanı sistemleri.
Kullandığımız hangi veritabanı sistemi olursa olsun bir sorgu (quary) hazırlar
ve veritabanı sunucusuna göndeririz. Geriye dönen veriye göre programımız
gerekli işlemleri yapmaya devam eder. LINQ dediğimiz sistem ise herhangi bir
veritabanı teknolojisi ile bire bir bağlantılı değil. Daha açık dile getirmek
gerekirse, LINQ SQL2008 ile veya başka bir veritabanı sistemi ile beraber
geliyor olmayacak. LINQ tamamen Visual Basic
veya C# kodlarımızda kullanacağımız "sorguları"
tanımlıyor. Ve günün sorusu geliyor; "Veritabanını sorgulamayacaksak VB veya
C# içinde neyi sorgulayacağız?" Biraz düşünelim, bizim elimizde program
kodlarını yazarken hangi veriler oluyor? Tabi ki .NET objeleri. Sizi daha çok
meraka ve sıkıntıya sokmadan hemen bir örnek görelim.
Dim Sayilar() As Integer = {5, 7, 1, 4, 9, 3, 2, 6, 8}
Yukarıdaki gibi bir dizimizin olduğunu varsayalım. Bu
dizi içerisindeki değerlerden sadece 5'ten ufak olanları küçükten büyüğe
sıralayarak almak için nasıl bir kod yazardınız? Aşağıdaki gibi bir kod
yazamayacağımız kesin.
Dim Bulunanlar = From n In Sayilar Select n Where n <= 5 Order By n
For Each n As Integer In Bulunanlar
Response.Write(n)
Next
Muhteşem değil mi? LINQ ile ilk olarak sanırım bir yıl kadar önce karşılaştım
ve ilk tepkim "Bu işin cılkı çıktı" şeklindeydi :) Haklı olarak bir an
için yukarıdaki gibi SQL yazımına yakın bir kodu VB ile yazabiliyor olmanın
artık işimizi gereğinden fazla kolaylaştırdığını düşündüm. Tabiri caiz ise artık
.NET tarafında da verilerle oynamak çocuk oyuncağı haline geliyor.
Aşağıdaki örnekte veritabanından veri çekmek yerine VB kodu ile bir DataTable
oluşturarak içerisinde üç satır bilgi yerleştirdim. Bakın DataTable üzerine
sorgu göndermek ne kadar kolay.
Dim tablom As New Data.DataTable
tablom.Columns.Add(New Data.DataColumn("Kolon1"))
Dim satir As Data.DataRow = tablom.NewRow
satir.Item(0) = "Deneme"
tablom.Rows.Add(satir)
satir = tablom.NewRow
satir.Item(0) = "Denek"
tablom.Rows.Add(satir)
satir = tablom.NewRow
satir.Item(0) = "Daron"
tablom.Rows.Add(satir)
Dim Bulunanlar = From n In tablom.Rows Where n.item(0) Like "*D*" Order By n.item(0)
For Each n As Data.DataRow In Bulunanlar
Response.Write(n.Item(0))
Next
Muhteşem. Ama bu kadarla kalmıyor gelişmeler. LINQ'nin birçok uygulanma şekli
var. LINQ2XML, LINQ2SQL, LINQ2Entity vs... Maalesef bunların hepsinden
bahsetmeyeceğim. Yukarıda incelediğimiz kısım LINQ2Entity veya LINQ2Objects
olarak adlandırılabilir. Şimdi bir de LINQ2XML ile ilgili ufak bir örnek
yapalım.
Dim Adam As XElement = _
<Adam>
<Adi>Daron</Adi>
<Soyadi>Yöndem</Soyadi>
</Adam>
Response.Write(Adam.<Adi>.Value)
Hayatımızın çok kolaylaşacağı ortada. Yukarda gördüğümüz kodlar bize en
uzak seçenekte 6 ay mesafede. Peki şimdiden LINQ ile denemeler yapmak için
nelere ihtiyacınız var? Özet olarak Visual Studio 2008 diyebilirim. Visual
Studio 2008'e ait Beta2 sürümünü Microsoft web sitesinden indirebilirsiniz.
Hatta direk sanal makine imajları da mevcut, bilgisayarınıza kurmadan direk
sanal makineyi Virtual PC ile çalıştırarak var olan sisteminizi etkilemeden
denemeler yapabilirsiniz. Tüm bu yazılımları ücretsiz indirmek için aşağıdaki
linkleri kullanabilirsiniz.
Visual Studio 2008 Beta 2 Download
Virtual PC 2007 Download
Beta 2 aşamasında olan bir ürünün parçası olarak şu an LINQ'yu üretim amacıyla
kullanmak pek mümkün değil. O nedenle önümüzdeki dönemde LINQ ile ilgili detaylı
yazılar yazmayacağım. Yazılarımı takip edenler bilirler, her yeni çıkan
teknoloji veya ürün bende küçük bir çocuğa verilen oyuncaktan farksız etki
yaratır.Yazımın başında da bahsettiğim gibi zaten hali hazırda yeni "programcı
oyuncakları" olarak elimizde yepyeni Silverlight, Expression Studio duruyor.
LINQ biraz bekleyebilir :)
Bu yazımda amacım sizlere geleceğe yönelik ufak bir öngörü aktarmaktı. Hepinize
kolay gelsin.
|
Copyright © 2010 Daron Yöndem.
Tüm hakları saklıdır.
|
|