Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

LINQ (Language Integrated Query)

LINQ (Language Integrated Query) yani “Dil ile Bütünleşik Sorgu” anlamına gelen, .NET dillerinde veritabanı sorgulama işlemini programatik kısımda gerçekleştirebilmemizi sağlayan, Microsoft .NET Framework bileşenidir.

Bu yazı LINQ ‘ ya giriş niteliği taşımaktadır.
LINQ TO OBJECTS konusuyla giriş yapıp , LINQ sorgularının genel olarak nasıl yapıldığını göstermek istiyorum.
Öncelikle LINQ yapısının nasıl olduğunu izah edeyim.

            var GelenDegerleriTutacakDegisken = from BirNesne in NesnelerKoleksiyonuVeyaDizisi
                                                where VarsaŞart
                                                select SepeteAt(BirNesne);

LINQ sorgularında geri dönen sonuçları genellikle var tipinden değişkenlere atıyoruz.Bunun sebebini LINQ yazılarımı okudukça anlayacaksınız.
“in” anahtar sözcüğünden sonra Koleksiyon veya Dizi verilir.İşte bu koleksiyon veya dizinin içinde dönüldüğünde, elde edilen her bir eleman “in” anahtar sözcüğünden önceki, ya da “from” anahtar sözcüğünden hemen sonraki “BirNesne” diye adlandırılan değişkende tutulur.Varsa şartımız “where” anahtar sözcüğünden sonra bu değişken üzerinden yapılır.Ve en son “select” deyimiyle bu değişkenimiz “BirNesne” arka planda oluşuturulan bir koleksiyona atılıp, var tipinden olan GelenDegerleriTutacakDegisken adındaki değişkene bu koleksiyon gönderilir.
Şimdi örneklerle pekiştirelim.
Öncelikle Form ekranına birer ListBox ve Button nesneleri kolayım.
Örneklerde kullanmak amacıyla, int tipinden bir dizi değişkeni oluşturup içine bir kaçtane sayı giriyorum.

            int[] Sayilar = new int[]{3,5,12,24,88,112,181,223,234,509};

Şimdi LINQ kullanmadan 5 ten büyük olan sayıları getirelim.

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < Sayilar.Length; i++)
            {
                if (Sayilar[i] > 5)
                {
                    listBox1.Items.Add(Sayilar[i]);
                }
            }
        }

Button nesnesine tıkladığımızda ListBox nesnesinde 5 ten büyük sayıların listelendiğini göreceğiz.Aynı işlemi LINQ kullanarak yapalım.

        private void button1_Click(object sender, EventArgs e)
        {
            var BestenBuyukSayilar = from Sayi in Sayilar
                                     where Sayi > 5
                                     select Sayi;
            foreach (var item in BestenBuyukSayilar)
            {
                listBox1.Items.Add(item);
            }
        }

Yukarıdaki kod bloğunu çalıştırırsak eğer, 5 ten büyük sayıların ListBox nesnesinde listelendiğini göreceğiz.
Ben int tipinden bir dizi değişkende çalıştığımı biliyorum.Gelen LINQ sorgulamasında , int tipindeki bir değişken üzerinden çalıştığım halde gelen sonuçların var tipinden bir değişkene atılması benim için pek ehli bir durum olamaz.O yüzden gelen sonuçları int tipinden bir diziye ya da koleksiyona atabilirim.

        private void button1_Click(object sender, EventArgs e)
        {
            int[] BestenBuyukSayilar = (from Sayi in Sayilar
                                     where Sayi > 5
                                     select Sayi).ToArray<int>();
            foreach (int item in BestenBuyukSayilar)
            {
                listBox1.Items.Add(item);
            }
        }

Gördüğünüz gibi sonuç kümesini ,var tipinden değilde int tipinden bir diziye attım.Tabi bunu yaparken, bir extension metod olan ToArray() metodunuda yazmamız gerekiyor.(Extension metodları ileri LINQ yazılarımda anlatacağım.)

        private void button1_Click(object sender, EventArgs e)
        {
            List<int> BestenBuyukSayilar = (from Sayi in Sayilar
                                     where Sayi > 5
                                     select Sayi).ToList<int>();
            foreach (int item in BestenBuyukSayilar)
            {
                listBox1.Items.Add(item);
            }
        }

Yukarıdaki örnekte ise, sonuç kümesini int tipinden koleksiyona atıyorum.


Şuana kadar foreach döngüsünden gelen her elemanı var tipinde karşıladık.Bir kaç yerde sonuç kümesini int dizi ya da koleksiyonuna çevirerek işlem yaptığımız için int tipinde elemanları karşıladığımız oldu.Belirli bir tipin koleksiyonunda LINQ ile sorgulama yaptıktan sonra, biliyorsunuz ki sonuç kümesini o koleksiyon tipinden elde edebilirsiniz.Ama bu tipten kesinlikle eminseniz.O tipten elde etmeyipte var tipindende edebilirsiniz.foreach döngüsü sayesinde o koleksiyonda dönerken, ele alınan her elemanı var değilde, o tipten karşılayabilirsiniz.
Örnek olarak aşağıdaki kodları inceleyiniz.

            DirectoryInfo DosyaBilgileri = new DirectoryInfo("C:/");
            //C dizisindeki dosyaların bilgilerini öğrenmek istiyorum.
            FileInfo[] Dosyalar = DosyaBilgileri.GetFiles();
            //GetFiles() metodu sayesinde bütün dosyalara ulaşabilirim.FileInfo[] dizisi tipinden geri dönmektedir.
            //Örnek olarak bu dosyalardan boyutu 1000 den büyük olanları LINQ diliyle sorgulayıp seçelim.
            var Sonuc = from Dosya in Dosyalar
                               where Dosya.Length > 1000
                               select Dosya;
            //Gördüğünüz gibi sonuç kümesi var tipinden Sonuc değişkenine atandı.
            foreach (FileInfo item in Sonuc)
            {
                listBox1.Items.Add(item.Name + " - " + item.Length);
            }
            //Gördüğünüz gibi, var tipinden Sonuc değişkenin içinde FileInfo nesneleri olduğunu kesin bildiğim için döngüdeki ele alınan her elemanı FileInfo tipinden karşılayabiliyorum.

Yukarıdaki işlemin sonucunu istediğim bir sınıfın entitysi olarakta dönebilirim.Örneğin, DosyaBilgisi adında bir class yazdığımızı düşünelim.LINQ komutlarıyla “C” dizisindeki dosyaları yoklayıp onların FileInfo tipinden bütün özelliklerini alıp, “select” anahtar sözcüğüyle arkaplanda oluşturulan koleksiyona atıyorduk.Yani gelen nesneyi geldiği gibi gönderiyorduk.Ancak ben gelen nesneyi, kendi istediğim(DosyaBilgisi) nesnesinden döndürmek istiyorum.
Anlatmak istediğimi kodlar üzerinden izah etmeye çalışayım.
Öncelikle DosyaBilgisi adında bir class oluşturalım.

        class DosyaBilgisi
        {
            public int DosyaBoyutu { get; set; }
            public string DosyaAdi { get; set; }
            public DateTime OlusturulmaTarihi { get; set; }
        }

Classımızı oluşturduk.Ardından LINQ sorgulama yapıp, DosyaBilgisi entityleri geri döndürelim.

            DirectoryInfo DosyaBilgileri = new DirectoryInfo("C:/");
            FileInfo[] Dosyalar = DosyaBilgileri.GetFiles();
            var Sonuc = from Dosya in Dosyalar
                        where Dosya.Length > 1000
                        select new DosyaBilgisi
                        {
                             DosyaAdi = Dosya.Name,
                              DosyaBoyutu = Dosya.Length,
                               OlusturulmaTarihi = Dosya.CreationTime
                        };

Gördüğünüz gibi, Dosyalar koleksiyonunda LINQ sayesinde sorgulama yapıyorum ve sonuç kümesi olarak “select Dosya” deyip komple FileInfo tipinden nesneyi arka plandaki oluşturulan koleksiyona göndermiyorum.Artık şartıma uygun FileInfo nesnelerinin istediğim özelliklerini, DosyaBilgisi entitysinin özelliklerine verip arka plandaki oluşturulan koleksiyona DosyaBilgisi nesnesi gönderiyorum.

            DirectoryInfo DosyaBilgileri = new DirectoryInfo("C:/");
            FileInfo[] Dosyalar = DosyaBilgileri.GetFiles();
            var Sonuc = from Dosya in Dosyalar
                        where Dosya.Length > 1000
                        select new DosyaBilgisi
                        {
                             DosyaAdi = Dosya.Name,
                              DosyaBoyutu = Dosya.Length,
                               OlusturulmaTarihi = Dosya.CreationTime
                        };

ListBox’a sonuç kümesindeki değerleri yazdırmak istediğimiz zaman bakın neler oluyor.
Artık item.(nokta) dediğimizde, DosyaBilgisi adındaki sınıfımızın propertyleri gözüküyor.Önceden FileInfo nesnesini direkt gönderdiğimizden item.(nokta) dediğimizde FileInfo sınıfının özellikleriyle karşılaşıyorduk.Aradaki farkı umarım yakalayabilmişsinizdir.
Bu yazımın sonunada gelmiş bulunmaktayız.Elimden geldiği kadar açıklayıcı bir şekilde LINQ ya giriş yapmak istedim.Umarım faydasını görürsünüz.Sonraki yazılarımda görüşmek üzere.
İyi çalışmalar.

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir