18 Haziran 2010 Cuma

Linq To Sql Left Outer Join

İki tabloyu birlikte sorgulamak için inner join kullanırız. Bunu Linq To Sql ile yaparken aşağıdaki gibi bir Linq Query yazarak çözüyoruz
(Kisi, Telefon ve Adres tablolarımız olduğunu, bir kişinin de birden çok adresi ve telefonu olduğunu düşünüyoruz )
Bu sorgu sonucunda bana kişiler tablosundaki isimler ve bunlara ait telefon numaraları gelecektir.

from kisi in Kisis
join tlf in Telefons
on kisi.ID equals tlf.KisiID
select new
{
Ad = kisi.Ad,
Tlf = tlf.Numara
}

T-Sql çıktısı
SELECT [t0].[Ad], [t1].[Numara] AS [Tlf]
FROM [Kisi] AS [t0]
INNER JOIN [Telefon] AS [t1] ON [t0].[ID] = [t1].[KisiID]

Lambda Expression
Kisis.Join ( Telefons, kisi => kisi.ID, tlf => tlf.KisiID, (kisi, tlf) => new { Ad = kisi.Ad, Tlf = tlf.Numara } )



Senaryomuzu değiştirelim ;
Kişiler tablosundaki tüm kayıtlat gelsin, telefon numarası olmayanlar da gelsin telefonu yoksa null değer gelsin. Bunun içinde Left Outer Join ile çözeriz. Linq sorugumuzu şu şekilde değiştirmemiz yeterli olacaktır.

from kisi in Kisis
join tlf in Telefons
on kisi.ID equals tlf.KisiID into data
from x in data.DefaultIfEmpty()
select new
{
Ad = kisi.Ad,
Tlf = x.Numara
}

T-SQL çıktısı

SELECT [t0].[Ad], [t1].[Numara] AS [Tlf]
FROM [Kisi] AS [t0]
LEFT OUTER JOIN [Telefon] AS [t1] ON [t0].[ID] = [t1].[KisiID]

Lambda Expression
Kisis
.GroupJoin (
Telefons,
kisi => kisi.ID,
tlf => tlf.KisiID,
(kisi, data) =>
new
{
kisi = kisi,
data = data
}
)
.SelectMany (
temp0 => temp0.data.DefaultIfEmpty (),
(temp0, x) =>
new
{
Ad = temp0.kisi.Ad,
Tlf = x.Numara
}
)



Kaynak: http://www.oguzyagmur.com/PermaLink,guid,b9fcc750-0e3b-43e4-a9e8-212ee94afa4e.aspx

Hiç yorum yok:

Yorum Gönder