Linq-to-SQL ile Join İşlemleri
03 Mar 2015Linq to Sql işlemlerinde Join kullanımına değineceğiz, örnek olarak 3 tabloyu birleştirip DataGridView nesnemiz üzerinde nasıl göründüğüne bakacağız. Linq to Sql’de iki farklı şekilde sorgu yazabiliyoruz.
1. Yöntem
2. Yöntem
Şimdi gerçek değerler ile join kullanımında nasıl sonuçlar alacağımıza bakalım.
Burada kullandığımız örnekte Gelir(g), GelirKategorisi(gk) ve GelirAltKategorisi(gak) tablolarını birleştirdik. Sql de yazdığımız sorgudan biraz farklı olarak tabloları birbirine bağladığımız Id kolonlarını eşittir (=) yerine kelime anlamıda eşittir olan equals deyimini kullanıyoruz. Tablomuzu birleştirdikten sonra orderby deyimi ile tarihe göre artan sıralama yaptık azalan için bildiğiniz gibi orderby c.Tarih descending yazılabilir. Daha sonrasında select new diyerek hangi alanları grid üzerinde göstereceğimizi seçtirerek datagrid nesnemiz üzerine alıyoruz.
Tabi her kaydın bir alt kategorisi olmayabilir, bu durum ele alındığında yukarıdaki sorguya göre alt kategorisi null olan kayıt datagrid nesnemizde listelenmeyecektir. Alt kategorisi Null olan kayıtlarımızında listelenmesini istersek SQL’den bildiğimiz Left Join bize bu konuda yardımcı olacaktır. Dilerseniz hemen nasıl kullanıldığına bakalım.
Yine aynı şekilde join işlemimizi yaptık fakat bir öncekinden farklı olarak alt kategori işlemini bağladığımız bölümden sonra into deyimi ile yeni bir isim tanımlayarak DefaultIfEmpty() methodu ile null olan kayıtları da getirmesini istedik. Normalde SQL’de Left Join, Right Join gibi veri çekme çeşitlilikleri var fakat linq to sql’de bu çeşitlilik söz konusu olmadığı gibi DefaulIfEmpty() methodu ile select new bölümünde gördüğünüz üzere Ternary If kullanarak null gelen kayıtlara alt kategorisi olmadığı için Yok yazdırdık.
Linq to Sql’in sorgu şeklinde yazımını kullandık. Bir de method halinde yazımını inceleyelim. Biraz karmaşık gelebilir ama buradaki örneğe göre adım adım Visual Studio üzerinde yazarsanız intelisense‘in de yardımıyla gayet iyi anlayabileceğinizi düşünüyorum.
Join methodumuzu tanımlarken parantezi açtığımızda tooltip’teki açıklamada bizden istenen ilk değer inner olarak bağlayacağımız tablonun adı, daha sonra outerkey ve innerkey olarak id parametrelerimizi ister. new ile yeniden tanımlama yapılır. Group Join ile 3. tablomuzu da belirttikten sonra SelectMany methodu ile yaptığımız tanımlamaları aynı select new belirtirken yaptığımız gibi göstereceğimiz alanları belirtiyoruz. Alanlarımıza yaptığımız tanımlamaya göre merdiven gibi düşünürsek her seferinde bir üstteki bağlama giderek tablomuzdaki alanlara ulaşabiliyoruz. Açıklama yetersiz gelebilir bu yüzden uygulama halinde örnek yapmanızı şiddetle tavsiye ediyorum.
3. tablomuzu **Group Join** ile bağlamamızın sebebi **SelectMany** sırasında **DefaultIfEmpty()** methodunun Join methodunda çalışmaması, bunu kendi bilgi eksikliğimden yazıyorum. Eminim vardır bir yöntemi henüz araştırma fırsatım olmadı.
Lambda operatörü ile yaptığımız tanımlamalar sonrasında select işlemimizi de tamamladık ve OrderBy methodumuz ile belirlediğimiz alana göre ascending sıralamımızı gerçekleştirdik. Tam tersi için OrderByDescending methodunu kullanabilirsiniz. Sadece OrderBy methodu kullanılırsa ascending(artan) sıralama yapacaktır. Umarım faydalı bir yazı olmuştur. Yanlış ya da eksik bilgiye mahal vermiş olabilirim ve varsa sorularınız yorumda belirtirseniz sevinirim.