Bu yazıda outer join işlemlerini Linq sorgularıyla nasıl gerçekleştirebileceğimize bakacağız. Inner join işleminde birden fazla tablonun sadece istenen kolonlarının eşleştiği bilgileri getirilmesi sağlanır. Ancak bazı durumlarda tabloların alınacak kesişim kümesini biz belirlemek isteyebiliriz. Bunu iki basit veri tipi ile açıklayalım. Kitap ve SatisTipi adlı iki sınıf olsun.
public class Kitap { public int KitapNo { get; set; } public string KitapAdi { get; set; } } public class SatisDetay { public int SatisNo { get; set; } public int KitapNo { get; set; } public string SatisTipi { get; set; } }
Örnek verilerimiz de aşağıdaki gibi olsun.
List<Kitap> ktpListe = new List<Kitap> { new Kitap{KitapNo=1, KitapAdi="Kaiken"}, new Kitap{KitapNo=2, KitapAdi="Satori"}, new Kitap{KitapNo=3, KitapAdi="Şibumi"}, new Kitap{KitapNo=4, KitapAdi="Kişisel Bir Sorun"}, new Kitap{KitapNo=5, KitapAdi="Kappa"} }; List<SatisDetay> stsListe = new List<SatisDetay> { new SatisDetay{SatisNo=1, KitapNo=1, SatisTipi="Internet"}, new SatisDetay{SatisNo=2, KitapNo=2, SatisTipi="Magaza"}, new SatisDetay{SatisNo=3, KitapNo=3, SatisTipi="Internet"}, new SatisDetay{SatisNo=4, KitapNo=3, SatisTipi="Internet"} };
Eğer satışı gerçekleşen kitapların adını listelemek isteseydik inner join işlemini şu şekilde kullanabiliriz.
var kitaplar = (from k in ktpListe join s in stsListe on k.KitapNo equals s.KitapNo select k.KitapAdi ).Distinct();
Ancak satışı gerçekleşmeyen kitapları da aynı liste de görüntülemek isteseydik bu kez left join işlemi yapmamız gerekir. Satışı gerçekleşmeyen kitaplar için satış tipi NULL gelecektir. Burada DefaultIfEmpty() metodu dikkatinizi çekmiştir. a olarak ifade ettiğimiz tablodan b olarak ifade ettiğimiz SatisDetay tablosunda karşılığı boş olan kolonları da getirmesini sağladık.
var kitaplar = (from k in ktpListe join s in stsListe on k.KitapNo equals s.KitapNo into a from b in a.DefaultIfEmpty(new SatisDetay()) select k.KitapAdi ).Distinct();
Eğer mevcut tüm satış tiplerini getirmek istersek right join işlemi yapabiliriz.
var satisTipleri = (from s in stsListe join k in ktpListe on s.KitapNo equals k.KitapNo into a from b in a.DefaultIfEmpty(new Kitap()) select s.SatisTipi ).Distinct();