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

SharePoint 2010 - Content Query for Blog Posts

I hope this post will help many of you feel comfortable with using the Content Query Web Part. In this post I will walk you through the process of creating a content query web part and configuring it to show custom field types. I will also give details on how to use XSLT to stylize and format the data being pulled. I will be using the following scenario as an example. Say that you had a site collection with a top level publishing site. This publishing site would display a the most recent blog posts from all blog sites within its own site collection. To solve this problem we will use a Content Query Web Part and a customized ItemStyle.xsl using XSLT. Please note that the “SharePoint Server Publishing Infrastructure” needs to be enabled at the site collection to display the content query web part. Step 1: Add a Content Query Web Part to Page Navigate to the site that you want the blog posts to show up and click on edit page. Under Editing Tools in the Ribb

Microsoft .Net Framework 3.0 & 3.5 Full Download

.Net ile yazılım geliştiricilerin özelliklede Framework 3.x ile geliştirenlerin başlıca sorunu kurulum dosyası hazırladıklarında .Net Framework ‘ü kurmak için internete bağlanmalarıdır. Çünkü kurulum dosyaları 2-3 MB arasıdır. Yavaş internet kullanıcılarında ve kurumsal şirketlerde projelerin çok ama çok geç kurulmasına sebep olmaktadır. Bu sebepten ötürü sizlere .Net 3.x Framework ‘lerin tam kurulabilir paketlerinin linklerini sizlere sunuyorum. Umarım yararlı olur. Microsoft .NET Framework 3.5 Setup 32-bit version (Boyut(Size): ~200MB Microsoft .NET Framework 3.0 Setup 32-bit Version (Boyut(Size): ~50MB) 64-bit Version (Boyut(Size): ~90MB) Herkese iyi çalışmalar, kolay kurumlar diliyorum. :)

.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