Language Integrated Query, kısaca Linq .Net framework 3.5 sürümü ile birlikte tanımlı gelen bir özelliktir. .Net framework 2.0 sürümünde eklentilerle beraber kullanılıyordu. Linq sayesinde veritabanı ile kullanılan bir programlama dili arasında kodsal bir bütünlük sağlanmıştır. Sql ifadeslerine benzeyen söz dizimi ile farklı tiplerdeki verilerin sorgulanmasını sağlayan bir metadolojidir. Bu yazıda tüm linq metodlarını sıra sıra değinerek anlatmayacağım, biraz daha farklı noktaları değinmek amacım aslında. Linq kodlarını derlemek için Linqpad editörünü kullanıyor olacağım.
Lamda Expressions
Lambda ifadeleri anonim fonksiyonları ayrıştırma için güzel ve kompakt bir sözdizimi, şimdi customer nesnesinin içinden e-mail alanı null olmayan verilerini sorgulayacağız. Bu kadar basit bir sorguda bile lamda ifadesinin ne kadar sadeleştirdiğini görmüş olacağız.
//eski söz dizimi customers.Where(delegate(Customer c)) {return c.Email!=null; }) //yeni söz dizimi customers.where(c=>;c.Email!=null)
Extension Methods
Extension Methods’lar bir veri tipi üzerinde ekstra bir değişiklik yapmadan o tipi kolayca extend etmemizi sağlayan metodlardır. Bu metodları aslında birer static metod olarak düşünebiliriz, sadece tanımlamış olduğunuz veri tipleri üzerinden direk erişebilirler ve o veritipini tanımladığınız metoddaki içeriğe göre düzenleyip size geri dönen metodlardır. Extension methodslar da .Net Framework 3.5 ile kullanılmaya başlanmıştır. Şimdi basit bir extension method yazalım.
//eski yöntem IslemTarihi = row["ISLEMTARIHI"] == DBNull.Value ? DateTime.MinValue : Convert.ToDateTime(row["ISLEMTARIHI"]) //extension methods public static DateTime GetDatetimeValue(this DataRow row) { return row[0] == DBNull.Value ? DateTime.MinValue : Convert.ToDateTime(row[0]); } row["ISLEMTARIHI"].GetDatetimeValue();
Açıklama: Eski yöntem ile cast işlemini her item için istediğimiz tipe göre her satıra teker teker yazacaktık, bunun için ihtiyacımıza göre extension metodu bir kere yazdıktan sonra istediğimiz yerde kullanabiliriz. Burada metodun extension olmasını sağlayan this kelimesidir. Siz de ihtiyacınıza göre methoda başka parametreler verip kullanabilirsiniz.
Anonymous Types
Bir method içerisinde basit bir clasa ihtiyaç duyduk, gidip clasın propertylerini (private ve public), set metodunu tanımlayıp ondan nesne üretip kullanacaktık.Bunun yerine anonymous type bize tek satırla hem private hemde public propertylerinin oluşturulmasına hemde yönetilmesine imkan veriyor.
//bilindik yöntem public class OzlukBilgiler() { private string _adi; private string _babaAdi; private string _soyadi; private string _telefonNo; public string Soyadi { get { return _soyadi; } set { if (_soyadi != value) { _soyadi = value; OnPropertyChanged("Soyadi"); } } } public string BabaAdi { get { return _babaAdi; } set { if (_babaAdi != value) { _babaAdi = value; OnPropertyChanged("BabaAdi"); } } } public string Adi { get { return _adi; } set { if (_adi != value) { _adi = value; OnPropertyChanged("Adi"); } } } public string TelefonNo { get { return _telefonNo; } set { if (_telefonNo != value) { _telefonNo = value; OnPropertyChanged("TelefonNo"); } } } public OzlukBilgiler(string Adi, string Soyadi, string BabaAdi,string TelefonNo)    { this.Adi = Adi; this.Soyadi = Soyadi; this.BabaAdi = BabaAdi; this.TelefonNo = TelefonNo; } } public class OzlukLoglama() { OzlukBilgiler obj = new OzlukBilgiler("Ahmet", "Akmaz", "Mehmet","02121234567"); string Loglanacak = string.Format("Hata Mesajı: {0}\nİsim: {1} {2}\nSoyad: {3}\n\nKullanıcıId: {4}\nBaba Adı: {5}\nTelefon: {6}", obj.Adi, obj.Soyadi(), obj.BabaAdi, obj.TelefonNo); File.WriteAllText(Loglanacak, @"C:\Log\Log.txt"); MessageBox.Show(Hata.Mesaj, Hata.Tarih); } }
public class OzlukLoglama() {//anonymous type var obj = new { Adi = "Ahmet", Soyadi = "Akmaz", BabaAdi="Mehmet", TelefonNo="2121234567" }; string Loglanacak = string.Format("Hata Mesajı: {0}\nİsim: {1} {2}\nSoyad: {3}\n\nKullanıcıId: {4}\nBaba Adı: {5}\nTelefon: {6}", obj.Adi, obj.Soyadi(), obj.BabaAdi, obj.TelefonNo); File.WriteAllText(Loglanacak, @"C:\Log\Log.txt"); MessageBox.Show(Hata.Mesaj, Hata.Tarih); }
Yield Keyword
İterasyon dediğimizde aklımıza gelen ilk yapı foreach döngüleri; arka planda bir iterator yapısını kullanıyorlar.Bir iterator yaratmak için IEnumerable, IEnumarator, IEnumerable <T>,
IEnumerator <T> interfacelerinin birinin dönüş tipinde olması gereklidir.
public static IEnumerable GetNumbers() { yield return "1"; yield return "2"; yield return "3"; yield return "4"; yield return "5"; yield return "6"; yield return "7"; } static void Main(string[] args) { foreach (var item in GetNumbers()) { Console.WriteLine(item); } Console.ReadKey(); }
Açıklama: Yukarıda da gördüğünüz gibi GetNumbers() metodunun içinde birden fazla return ifadesi kullanarak rakamları ardı sıra yazdığını gördük, bildiğiniz üzere
return ifadesinin böyle bir kullanımı yoktu, burdaki dikkat edilecek nokta, compiler her yield keywordünü gördüğünde bundan önceki yield keywordünün kaldığı yeri saklamakta ve her çağırıldığında baştan başlamak yerine kaldığı yerden devam etmektedir.
Keyifli çalışmalar.