Ana içeriğe atla

LINQ to SQL – JOIN

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.



SQL Server Profiler




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.


Yorumlar

Bu blogdaki popüler yayınlar

Olasılıksız - Kitap Yorum

Olasılıksız hayatımda okuduğum en iyi kitaptı. Tek çırpıda hiç sıkılmadan, eğlenerek okudum bu kitabı, tavsiyem sizinde okumanız.Kitabın kapağı ve içeriği ile ilgili kısa bilgi aşağıdadır.Olasılık, tahmin, düşünceler, nöbetler, karışıklıklar, ileriyi görebilme zannı, dejavu ve tabii ki olasılıksız şeyler. Bu kelimelerle içli dışlı olabileceğiniz, bütün bu kelimelerin yaşamdaki yerini kavrayabileceğiniz müthiş bir uyarlama.Adam Fawer' ın ortaya çıkardığı bu uyarlama romanın müthiş bir çalışmanın ve araştırmanın sonucu ortaya çıktığının kitabın başından sonuna kadar farkındasınız. Bu uyarlamasını, derin araştırmalarıyla birleştirip romanı tekdüzelikten çıkarıp müthiş bir yere koyduğu için de Fawer' a müteşekkir oluveriyorsunuz. Sıkıcı diye nitelendirebileceğiniz teorik bilgileri bile bir çırpıda okuyuveriyorsunuz. Teorik bilgiler dahi olaylarla sonuna kadar bağlantılı aktarılmış. Tekdüzelikten çıkmış bir roman; olasılıksız. Her an olayın kurgusunun değişmesi olasılık dahilinde. …

.Net 3.5 SP1 – Full Install Packages (Tam Kurulum)

.Net Framework 3.5 SP1 ‘i bilgisayarınıza kurmak istediğinizde normal şartlar altında Microsoft ‘un sitesinde 2.7 mb ‘lik bir dosya indirir ve kurulum işlemlerinizi bu dosya üzerinden yaparsınız. Ancak bu indirmiş oluğunuz dosya yaklaşık 220 mb ‘lik veriyi internetten indirerek kurulum yapmaktadır. İnternet çıkışına izin verilmeyen kurumlar ve kuruluşlar için bu durum bir sıkıntı oluşturmaktadır. Bu sebepten ötürü aşağıdaki link yardımı ile tam yükleme paketini indirdikten sonra hiç internet ihtiyacınız olmadan .Net 3.5 SP1 ‘i kurabilmeniz mümkün olacaktır.Link

Çoklu Dil Desteği – Veri Tabanı Tasarım Örnekleri ile

Zaman içerisinde karşımıza çok farklı projeler gelebilmektedir. Ancak bu projeler içerisinde özellikle de global ölçekli ya da bu ölçekte uygulama geliştiren firmalarda bazı temel gereksinimler sürekli olarak karşımıza çıkabilmektedir. Bu gereksinimlerden biri ve belki de en önemlisi olan çoklu dil desteğinin veri tabanı (DB) katmanında nasıl yapıldığını kısa ve hızlıca inceliyor olacağız.Öncelikle çoklu dil desteği dediğimizde aklımıza gelen ilk çözüm yolu *.resx dosyalarını kullanmak gelmektedir. Ancak bu uzaktan yönetilen ya da anlık olarak metin değişikliği gereksinimi bulunan uygulamalarda bazı ufak problemler çıkartabilmektedir.Ne gibi problemler derseniz; iki grupta inceleyebiliriz. Web projeleri ve windows üzerinde çalışan projeler.Web projelerinde IIS üzerinde yer alan bir *.resx dosyasını değiştirdiğinizde son kullanıcı tarafında etkisi hemen görülmeyebilir. Cache mekanizmaları sebebiyle ortalama 15-30 dakika arasında bir görüntüleme süre farkı ile karşılaşabiliriz. Faha köt…