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

Linq To Sql Gruplama(Group By)

Bu yazımda LINQ’da Group By ifadesinin nasıl kullanıldığından bahsedeceğim.

Gruplama işlemini daha somut anlatabilmek için aşağıdaki örneği inceleyiniz.
Spain ülkesinde yaşayan müşterilerimizi çekip , şehir ve müşteri id lerini yazdıralım.

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = from musteri in Northwind.Musterilers
                        where musteri.Ulke == "Spain"
                        select musteri;
            foreach (var item in Sonuc)
            {
                listBox1.Items.Add(item.Sehir + " - " + item.MusteriID);
            }

Bu kod bloğunu derleyip çalıştırırsak eğer, aşağıdaki gibi bir sonuçla karşılaşırız.
 Burada gruplama işlemi nasıl kullanılabilir.Öncelikle bunu konuşalım.Madrid’de,Barcelona’da ve Sevilla’da kaç müşteri mevcut? sorusuna cevap arıyorsanız eğer gruplama işlemi mecburidir.
Üç tane Madrid ve birer Barcelona ve Sevilla mevcut.Barcelona ve Sevilla tek olduğundan dolayı gruplamayla ilgili sıkıntımız yok.Ancak üç tane Madrid’i gruplamamız gerekiyor.Yani tek Madrid yapmamız gerekiyor. Bu işlemleri SQL Server’da nasıl yapıldığını, Transact Sql(String Fonk.-Matematik Fonk.-Tarih Fonk.-Top-Distinct-Escape-Group By-Having-Joinler-Insert-Update-Delete) isimli yazımda anlatmıştım.Şimdi LINQ teknolojisi ile yapmayı görelim.

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = from musteri in Northwind.Musterilers
                        where musteri.Ulke == "Spain"
                        group musteri by musteri.Sehir into Grup
                        select new
                        {
                            Musteri = Grup,
                            Sehir = Grup.Key
                        };
            foreach (var item in Sonuc)
            {
                listBox1.Items.Add(item.Sehir + " şehrinde " + item.Musteri.Count() + " adet müşterimiz mevcut.");
                foreach (var musteri in item.Musteri)
                {
                    listBox1.Items.Add("-->" + musteri.MusteriID);
                }
            }

Yukarıda gördüğünüz gibi Group By ifadesi SQL Server versiyonundan biraz farklı.Şimdi bunu izah edeyim.
” group musteri by musteri.Sehir into Grup ” öncelikle bu satırı ele alalım.
“group” anahtar sözcüğünden sonraki “musteri” isimli parametre, hangi nesnenin gruplanacağını belirtir.”by” anahtar sözcüğünden sonraki ifadede, gruplanacak nesnenin(musteri) hangi propertysinin(özellik) gruplanacağı belirtilir.”into” anahtar sözcüğünden sonra “Grup” isimli parametrede ise bu grup saklanır.Buradaki parametrelerin isimlerini siz özgür iradelerinizle değiştirebilirsiniz.

select new
{
Musteri = Grup,
Sehir = Grup.Key
};

Şimdide bu kod bloğunu izah edeyim.”into” anahtar sözcüğünden sonra “Grup” adındaki parametrenizin “Key” özelliği, gruplanan propertyleri saklarken , “Grup” parametresinin kendisi, gruplanan “musteri” adındaki nesneyi saklar.
Sonuç olarak yukarıdaki kodların çıktısı aşağıdaki gibi olacaktır.


Son olarak yukarıdaki işlemleri Extension metodla nasıl yapabiliriz onu göstermek istiyorum.

            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = Northwind.Musterilers.Where(Musteri => Musteri.Ulke == "Spain").GroupBy(Musteri => Musteri.Sehir);
            foreach (var item in Sonuc)
            {
                listBox1.Items.Add(item.Key + " şehrinde " + item.Count() + " adet müşterimiz var.");
                foreach (var Musteri in item)
                {
                    listBox1.Items.Add("-->>" + Musteri.MusteriID);
                }
            }

Son bir örnek yapıp konuyu kapatmak istiyorum.
Yıla göre elde ettiğimiz gelirler.

//LINQ teknolojisiyle..
            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = from detay in Northwind.Satis_Detaylaris
                        group detay by detay.Satislar.SatisTarihi.Value.Year into Grup
                        select new
                        {
                            Gelir = Grup.Sum(Satis => Satis.Miktar * Satis.BirimFiyati),
                            Yil = Grup.Key
                        };
            foreach (var item in Sonuc)
            {
                listBox1.Items.Add(item.Yil + " yılında " + item.Gelir + " gelirimiz var");
            }
//Extension metod ile
            NorthwindDataContext Northwind = new NorthwindDataContext();
            var Sonuc = Northwind.Satis_Detaylaris.GroupBy(Satis => Satis.Satislar.SatisTarihi.Value.Year);
            foreach (var item in Sonuc)
            {
                listBox1.Items.Add(item.Key + " yılında toplam " + item.Sum(Satis=>Satis.Miktar * Satis.BirimFiyati) + " gelir elde edilmiştir.");

Bu örneğide derleyip çalıştırdığınız zaman gruplanmış şekilde yıllara göre gelirleri gösterdiğini göreceksiniz.
Artık LINQ’da Group By anahtar sözcüğüyle gruplama işlemini rahatlıkla yapabiliriz.

Sonraki yazılarımda görüşmek üzere…

İyi Çalışmalar 🙂

Bunlar da hoşunuza gidebilir...

5 Cevaplar

  1. ömer dedi ki:

    Çok beğendiğim ve uzun süredir takip ettiğim bir sitedir. Bunun gibi bir çok konuda paylaşım yapıyor ve hepsi özgün paylaşımlardır. Tavsiye ederim.

  2. Elif dedi ki:

    bayıldımm….Ya müthiş anlatımların Allah razı olsun 🙂

  3. Emre dedi ki:

    Müthiş bir anlatım gerçekten faydalı oldu elinize kolunuza sağlık. Asp.net, c#, mvc ve programlama konularında takip ettiğim kaliteli forumlardan birisiniz. sağolun

Bir cevap yazın

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

*