LINQ to SQL verileri uygulama içerisinde nesnesel olarak kullanabilmemize ve işlemlerimizi oldukça kolaylaştıran bir yapıdır. Select, insert, update, delete ve diğer aklımıza gelen SQL işlemlerini basitçe yapabiliyor ve verileri hızlıca bizlere sunabiliyor. Bu yazımızı bana sıklıkça gelen maillerden ötürü yazacağım. Özellikle LINQ to SQL ile ilgili konudaki mailleri filtrelediğimde en sık sorulan sorunun nasıl JOIN ‘in kullanılacağı olduğundan LINQ to SQL ile join işlemlerini nasıl yapabileceğimizi basitçe ve örneklerle inceleyeceğiz.
Uygulamada yer alan örnekleri ve kullanbilmeniz için sisteminizde Nortwind veri tabanının kurulu olması ve oluşturmuş olduğunuz projenin en az .Net Framework 3.0 sürümünde oluyor olması gerekmektedir.
Oluşturulan projeye LinqToSQL veri katmanı ekleniyor, içerisine Nortwind veri tabanı gösteriliyor ve kod kısmında,
NorthwindDataContext dataContext = new NorthwindDataContext();
İle veri kümesine gerekli bağlantıyı kuruyoruz.
Inner Join
var q1 = from c in dataContext.Customers
join o in dataContext.Orders on c.CustomerID equals o.CustomerID
select new
{
c.CustomerID,
c.ContactName,
o.OrderID,
o.OrderDate
};
LINQ to SQL sorgusu sonucunda oluşan arka tarafta çalışan SQL sorugusu aşağıdaki gibidir.
Not: Oluşan sorguları kontrol etmek için SQL versiyonunun bulunduğu klasöre gidip Performance Tools içerisinde yer alan SQL Server Profiler ‘i kullanarak erişebilirsiniz.
SELECT [t0].[CustomerID], [t0].[ContactName], [t1].[OrderID], [t1].[OrderDate]
FROM [dbo].[Customers] AS [t0]
INNER JOIN [dbo].[Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID]
İlişkili iki tabloyu tek kriter ve inner join ile nasıl eşleştirebileceğimize göz attık.
Left Join
var q2 = from c in dataContext.Customers
join o in dataContext.Orders on c.CustomerID equals o.CustomerID into g
from a in g.DefaultIfEmpty()
select new
{
c.CustomerID,
c.ContactName,
a.OrderID,
a.OrderDate
};
Left Join kullanımının Inner Join kullanımından tek farkı ve en büyük farkı standart şekilde verileri join ettikten sonra bu birleşime into deyimi yardımı ile bir alias veriyoruz ve sonrasında ana tabloyu join edilmiş tablonun içindekiler yardımı ile verileri getir diyoruz. Ancak eşleşmeyen olmama ihtimalini de göz önüne alarak DefaultIfEmpty() de kullanılarak Left Join işlemi sağlanmış olur.
SELECT [t0].[CustomerID], [t0].[ContactName], [t1].[OrderID] AS [OrderID]
, [t1].[OrderDate] AS [OrderDate]
FROM [dbo].[Customers] AS [t0]
LEFT OUTER JOIN [dbo].[Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID]
Yaptığımız işlemin Left Join ile ilgili işlemleri sağladığını oluşan SQL kodu yardımı ile görebiliyoruz.
Inner Join – Birden Fazla Kriter ile İlişkilendirmek
Tablolar arası Join işlemlerini yaparken çoğunluklu tek kriter yerine birden fazla kriter yardımı ile ilişki kurulduğu daha çok gözlemlenebilecek bir durumdur. Bu şartlar altında şimdi birden fazla kriter yardımı ile Inner Join işlemini nasıl yapabileceğimize göz atalım.
var q3 = from c in dataContext.Customers
join o in dataContext.Orders on
new { a = c.CustomerID, b = c.Country }
equals new { a = o.CustomerID, b = "TR" }
select new
{
c.CustomerID,
c.ContactName,
o.OrderID,
o.OrderDate
};
Bu koşulu sağlamak için tek yapmamız gereken karşılaştıracağımız parametleri aynı sıra halinde olacak şekilde generic koleksiyon içerisinde kullanarak equals deyimi yardımı ile eşlemek olacaktır.
SELECT [t0].[CustomerID], [t0].[ContactName], [t1].[OrderID], [t1].[OrderDate]
FROM [dbo].[Customers] AS [t0]
INNER JOIN [dbo].[Orders] AS [t1] ON ([t0].[CustomerID] = [t1].[CustomerID])
AND ([t0].[Country] = @p0)
Inner Join – Birden Fazla Kriteri OR ile İlişkilendirmek
Tablolar arası ilişki kurarken karşılaştıralan bütün kriterlerin hepsinin aynı anda sağlanması istenmeye bilir. Bu durumda SQL üzerinde kullandığımız OR deyimini LINQ to SQL ‘e nasıl uyarlayabileceğimize göz atacağız.
var q4 = from c in dataContext.Customers
from o in dataContext.Orders.Where(a => a.CustomerID == c.CustomerID
|| c.Country == "USA")
select new
{
c.CustomerID,
c.ContactName,
o.OrderID,
o.OrderDate
};
Kullanmamız gereken sadece AND yerine || ifadesi olacaktır.
SELECT [t0].[CustomerID], [t0].[ContactName], [t1].[OrderID], [t1].[OrderDate]
FROM [dbo].[Customers] AS [t0], [dbo].[Orders] AS [t1]
WHERE ([t1].[CustomerID] = [t0].[CustomerID]) OR ([t0].[Country] = @p0)
Left Join – Birden Fazla Kriteri OR ile İlişkilendirmek
Tablolar arasında birden fazla kriterleri Inner Join ile birlikte Left Join ile de birleştirebiliriz. Yine || ifadesi yardımı işlemi gerçekleştireceğiz.
var q5 = from c in dataContext.Customers
from o in dataContext.Orders.Where(a => a.CustomerID == c.CustomerID
|| c.Country == "USA").DefaultIfEmpty()
select new
{
c.CustomerID,
c.ContactName,
o.OrderID,
o.OrderDate
};
Inner Join yardımı ile yapmış olduğumuz işlem ile aynı olmakla birlikte fark olarak yine DefaultIfEmpty() deyimidir.
Not: Left Join işlemi kullandığınızda kesinlikle yapmış olduğunuz ilişkiyi DefaultIfEmpty() ile bitirmeniz gerekmektedir.
SELECT [t0].[CustomerID], [t0].[ContactName], [t1].[OrderID] AS [OrderID]
, [t1].[OrderDate] AS [OrderDate]
FROM [dbo].[Customers] AS [t0]
LEFT OUTER JOIN [dbo].[Orders] AS [t1] ON ([t1].[CustomerID]=[t0].[CustomerID])
OR ([t0].[Country] = @p0)
Sonuç olarak bu yazımızda LINQ to SQL yardımı ile Join işlemlerini nasıl yapabileceğimizi örnekler yardımı ile incelemeye çalıştık.
Umarım yararlı olmuştur.
Turhal Temizer
www.turhaltemizer.com