Şub
19
2013

Linq to Sql Ogreniyorum 4

Linq  To  SQL Komutlarınından   Inner Join ,  Left Join ,  Rigth, Cross Join açıklamaya ve  örnekler yapmaya çalışacağız.

Single  SingleOrDefault , First  , FirstOrDefault komutlarında ise makalenin sonunda kısa kısa değineceğim.

 

Join  Komutu Kullanımı

SQL Sorgulama dilinde birden fazla tabloyu birleştirme yada ilgili başka tablodan veri çekmek için Inner, Outer, Left, Rigth Cross Join segmentleri kullanılır.

 

Inner Join

INNER JOIN, iki ya da daha fazla tabloda ortak olan iki alandaki değerleri kontrol ederek tabloları birleştirir. INNER JOIN, SQL sunucusunda varsayılan olan JOIN dir. INNER JOIN yerine sadece JOIN yazmak da yeterlidir. WHERE ifadesi kullanarak oluşturmak istenen sonuç tablosu daha da özelleştirilebilir. JOIN kullanırken “null” değerlerini birleştirme şartı olarak kulanmamak gerekir.

 

Outer Join

FULL JOIN, LEFT OUTER JOIN ve RIGHT OUTER JOIN, ortak alanlar vasıtasıyla birleştirme yaparken birleştirme şartına uymayan satırlarda “null”değeri oluşmasını sağlar.

OUTER JOIN sadece iki tablo arasında kullanılır. LEFT OUTER JOIN kullanılırsa ifadenin solunda ismi yazan tabloda istenilen alanda tüm satırlar sonuç tablosunda gösterilir. RIGHT OUTER JOIN kullanılırsa ifadenin sağında ismi yazan tabloda istenilen alanda tüm satırlar sonuç tablosunda gösterilir. FULL JOIN kullanılırsa, her iki tablodan da tüm satırlar çekilerek sonuç tablosunda gösterilir.  LEFT OUTER JOIN için kısaca LEFT JOIN, RIGHT OUTER JOIN için de kısaca RIGHT JOIN  kullanılır.

 

Cross Join

 CROSS JOIN tablolar arasında yapılan birleştirme işleminde seçilen alanlar arasındaki tüm kombinasyonları sonuç tablosu olarak vermeyi sağlar. Veritabanlarında fazla kullanılmayan bir yöntem olan CROSS JOIN’in oluşturduğu sonuç tablosunda satır sayısı, alanların kartezyen çarpım sayısı kadardır. Örneğin; ilk alanda 2, ikinci alanda 3 satır varsa  2*3=6  tane satır oluşacaktır.

 

Şekil incelendiğinde konun daha iyi anlaşılacağını düşünüyorum.

LinqJoin

crossjoinimg

Join işleminin ne olduğunu ve nasıl yapıldığını anlamaya çalıştık şimdi ise join işlemini linq to sql ile gerçeklemeye çalışalım.

 

İnner Join

 Sorgularımızda kullanacağımız tablolar.

linq to sql inner join 1

 

Categories ve Products tablolarındaki CategoryID eşit olanların  Categories tablosundan CategoryName ,Product tablosundan ise ProductName ve UnitPrice alanlarını getirerek bir küme oluşturduk.

 

Query Syntax

 var ijoin = from k in myContext.Categories
                      join p in myContext.Products on k.CategoryID equals p.CategoryID
                        select new
                        {
                           k.CategoryName,
                           p.ProductName,
                            p.UnitPrice
                        };

 

 

Lambda Syntax

 var ijoin = myContext.Categories.Join(myContext.Products, k => k.CategoryID, p => p.CategoryID, (p, k) => new {p.CategoryName,k.ProductName,k.UnitPrice  });

 

linq to sql inner join 2

 

Join komutunu yerine where komutunu kullanarakta aynı işlemi yapabilmekteyiz. Sonuç değişmeyecektir.

 

Var  ijoin = from k in myContext.Categories
                        from p in myContext.Products
                       where k.CategoryID==p.CategoryID
                       select new
                      {
                           k.CategoryName,
                           p.ProductName,
                            p.UnitPrice
                       };

 

 

Bu sorgumuzda 6 tablo kullanara join işlemine tabi tutacağız.

 

linq to sql inner join 3

 

 

Burada Categories tablosundan CategoryName alanını, Products tablosundan ProductName alanını,Suppliers tablosundan City alanını, Order_Detail tablosundan Quantity alanını, Orders tablosundan ShipName alanını ve Employees tablosundan FirstName alanını CategoryName Beverages veya Condiments  olan ve City alanı London ve ya Bend eşit olan ve Quantity alanı 20 eşit olanların ilk beş kayıttan sonraki beş kayıtı CategoryName alanına göre sıralayıp getiren sorgudur.

 

Query Syntax

 

var ijoin = (from k in myContext.Categories
join a in myContext.Products on k.CategoryID equals a.CategoryID
join l in myContext.Suppliers on a.SupplierID equals l.SupplierID
join b in myContext.Order_Details on a.ProductID equals b.ProductID
join e in myContext.Orders on b.OrderID equals e.OrderID
join n in myContext.Employees on e.EmployeeID equals n.EmployeeID
where (k.CategoryName == "Beverages" || k.CategoryName == "Condiments") && (l.City == "London" || l.City == "Bend")  && b.Quantity == 20
orderby k.CategoryName
select new
{

k.CategoryName,
a.ProductName,
l.City,
b.Quantity,
e.ShipName,
n.FirstName

}).Skip(5).Take(5);

 

 

 

Bunu sorguyu where komutu kullanarak yaparsak.

 

var ijoin = (from k in myContext.Categories
                         from a in myContext.Products 
                         from l in myContext.Suppliers 
                        from b in myContext.Order_Details 
                         from e in myContext.Orders 
                       from n in myContext.Employees
                         where (k.CategoryID == a.CategoryID) && (a.SupplierID == l.SupplierID) && (a.ProductID == b.ProductID) && (b.OrderID == e.OrderID) && (e.EmployeeID == n.EmployeeID)&&(k.CategoryName == "Beverages" || k.CategoryName == "Condiments") &&(l.City == "London" || l.City == "Bend") && b.Quantity == 20
                         orderby k.CategoryName
                         select new
                         {

                            k.CategoryName,
                             a.ProductName,
                             l.City,
                             b.Quantity,
                             e.ShipName,
                             n.FirstName
                       }).Skip(5).Take(5);

 

 

linq to sql inner join 4

 

Left Join

 Category tablosu ile product tablosunda left join uyguladığmızda product tablosundaki tüm verileri sorgumuzu içine dahil etmiş olduk.

 

Query Syntax

 

var ijoin = (from c in myContext.Categories
join o in myContext.Products on c.CategoryID equals o.CategoryID into g
from a in g.DefaultIfEmpty()
orderby c.CategoryName
select new
{
c.CategoryName,
c.Description,
a.ProductName,
});

 

 

Lambda Syntax

var ijoin = myContext.Categories.Join(myContext.Products, k => k.CategoryID, p => p.CategoryID, (p, k) => new { p.CategoryName, p.Description, k.ProductName }).DefaultIfEmpty();

 

Where komutu kullanarak aynı sorguyu yazarsak.

 

var ijoin = from c in myContext.Categories
from o in myContext.Products.Where(o=>o.CategoryID==c.CategoryID).DefaultIfEmpty()
orderby c.CategoryName
select new
{
c.CategoryName,
c.Description,
o.ProductName
};

 

linq to sql inner join 5

 

Right  Join yapmak istediğimizde ise tabloların yerini değiştirmemiz yetecektir.

 

Cross Join

Category tablosundaki her bir kayıt için Product tablosundaki tüm verileri getiriyor. Makalenin başını okursanız çok daha iyi anlaşılır.

 

Query Syntax

var ijoin = from s in myContext.Categories
from c in myContext.Products
where s.CategoryID == 1 || s.CategoryID == 3
select new { s.CategoryID, s.CategoryName, c.ProductID, c.ProductName };

 


Lambda Syntax

var ijoin = myContext.Categories.Where(p => p.CategoryID == 1 || p.CategoryID==3 ).Join(myContext.Products, k => k.CategoryID, p => p.CategoryID, (p, k) => new { p.CategoryID, p.CategoryName, k.ProductID,k.ProductName });

 

linq to sql inner join 6

 

Single :  Tek bir eleman döndürdüğünden emin olduğunuz sorgular için kullanırız, eğer sorgu birden fazla eleman döndürecek olursa hata oluşacaktır.  Update işleminde kullanıyoruz.
SingleOrDefault : Hiç eleman dönmez ise generic tipin varsayılan değerini ya da nothing değeri dönecektir. Yine birden fazla değer varsa hata verir.
First : Dönen sorgu sonucunun ilk elemanını döndürecektir.
FirstOrDefault : Hiç eleman dönmez ise generic tipin varsayılan değerini ya da nothing değeri dönecektir.Yine birden fazla değer varsa hata verir.

 

Bu yazımızda Linq To SQL Komutlarınından   Inner Join ,  Left Join ,  Rigth, Cross Join  komutlarını incelemeye çalıştık ve Single  SingleOrDefault , First  , FirstOrDefault komutlarından kısa kısa bahsettik.

 

Yazar Hakkında

Harun Balta 63 adet yazısı bulunuyor..

Bilgisayar Mühendisliği Üzerine çalıştığım konular: C# , .Net , Silverlight , WPF , Entity Framework ,MVVM, Oracle ,Pl/Sql

Print Friendly