İç İçe LINQ Sorguları Oluşturma

İç İçe LINQ Sorguları Oluşturma

Bu makalede LINQ sorgularının veri birleştirme ve filtreleme işlemleri için nasıl kullanılabileceği ele alınmaktadır İç içe LINQ sorgularının kullanımı ile veriler daha kolay bir şekilde işlenebilir ve doğru sonuçlar elde edilebilir LINQ, veritabanları, XML dosyaları ve koleksiyonlar gibi farklı veri kaynaklarından veri sorgulama, işleme ve manipülasyonu için kullanılır Inner Join, Left Join ve Group Join gibi birleştirme işlemleri ile Where, Order By, Skip, Take gibi filtreleme işlemleri yapılabilir İç içe sorguların kullanımı ile veriler daha ayrıntılı bir şekilde filtrelenerek istenilen sonuçlar elde edilebilir

İç İçe LINQ Sorguları Oluşturma

Bu makalede, LINQ sorguları ile farklı veri kaynaklarından aldığımız verilerin nasıl birleştirilebileceği ve filtreleme işlemlerinin nasıl gerçekleştirilebileceği konusunda detaylı bir inceleme yapılacaktır. İç içe LINQ sorguları kullanarak verilerin daha kolay bir şekilde işlenebileceği ve daha doğru sonuçlar elde edilebileceği bilinmektedir. İster birleştirme işlemleri olsun, ister filtreleme işlemleri, İç içe LINQ sorgularının daha kolay ve anlaşılır bir kod yazımı sunması açısından önemlidir.

Birçok geliştiricinin kullanmaktan çekindiği LINQ sorguları aslında oldukça güçlü bir araçtır. Uzun ve karmaşık kodları minimum düzeyde azaltabilen LINQ sorguları, veri manipülasyonu sürecine büyük katkı sağlamaktadır. Bu makalede de amaç, LINQ sorgularını diğer birçok dilde yapılan sorgulama işlemlerinden ayıran farklı detayları ele alarak kullanmanızı, anlamanızı ve öğrenmenizi sağlamaktır.


LINQ Nedir?

LINQ (Language Integrated Query), C# ve .NET Framework uygulamalarında kullanılan bir teknolojidir. LINQ, veri sorgulama, işleme ve manipülasyonu için kullanılır. Bu teknoloji, veritabanları, XML dosyaları, koleksiyonlar gibi farklı veri kaynakları arasında sorgulama yapmamızı ve sonuçlarını yönetebilmemizi sağlar.

LINQ, C# kodu içinde kullanılabilen bir sorgulama tekniğidir. Sorgularımızı C# kodu yazarken, gereksiz SQL sorguları yazmaktan kurtuluruz. LINQ, sorgularımızı C# kodu içinde yazarak, veritabanı bağımsızlığına da sahip oluruz. Bu sayede veritabanı değişse bile, kodlarımızı güncellemek zorunda kalmayız.


İç İçe LINQ Sorguları

Birkaç farklı veri kaynağından aldığımız verileri filtrelemek ve birleştirmek gerektiğinde, iç içe LINQ sorguları kullanmanız gerekebilir. İç içe sorgular, birincil sorgunun sonucuna dayanan ikincil bir sorgu oluşturur. Bu, sınırlı sayıda sonuç setleri üzerinde çalışmanıza olanak tanır ve daha iyi performans sağlar.

Bu tür sorgular, verilerin birleştirilmesi ve filtrelenmesi için kullanır. Inner Join, Left Join, Group Join gibi birleştirme işlemleri ve Where, Order By, Skip, Take gibi filtreleme işlemleri yapılarak birden çok veri kaynağı birleştirilebilir. Bu, verilerin daha anlamlı bir şekilde görüntülenmesini sağlar ve işlemlerin daha etkili hale gelmesine olanak tanır.


Birleştirme İşlemleri

Birden fazla veri kaynağından veri çekerken ve bu verileri birleştirirken, LINQ iç içe sorgularının kullanılması oldukça yararlıdır. Bu yöntem sayesinde, verileri birden çok kaynaktan çağırıp bunları birleştirirken, istenen sonuçlara ulaşmak çok daha kolay hale gelir.

Birleştirme işlemleri Inner Join, Left Join ve Group Join gibi farklı yöntemler kullanılarak iç içe sorgularla gerçekleştirilir. Inner Join yöntemi, iki farklı veri kaynağından sadece ortak olan verilerin birleştirilmesini sağlar. Bu yöntem ile birleştirilen veriler, sadece ortak olan verilerdir.

Customers Orders
Tom 123
John 234
Sara 345

Yukarıdaki tablodan, "Customers" ve "Orders" veri kaynaklarından Inner Join kullanarak sadece ortak olan 123, 234 ve 345 numaralı siparişleri elde edebiliriz.

Left Join yöntemi ise, iki farklı veri kaynağından tüm verilerin birleştirilmesini sağlar. Ancak, ortak olmayan veriler NULL değerleriyle birleştirilir. Group Join yöntemi ise, bir veri kaynağını diğer bir veri kaynağına gruplama yaparak birleştirir. Ortak olmayan veriler de listelenir.

Birleştirme işlemleri genellikle verileri birbirine bağlama amacıyla kullanılır. İç içe sorgularla yapıldığında ise, verileri daha da ayrıntılı bir şekilde filtrelemek ve istenilen sonuçları daha da doğru bir şekilde elde etmek mümkün hale gelir.


Inner Join

Inner Join, iki farklı veri kaynağından sadece ortak olan verilerin birleştirilmesini sağlar. Verilerin ortak olduğunu belirlemek için JOIN anahtar kelimesi kullanılır ve sütunlar eşleştirilir.

Inner Join örneği aşağıdaki gibidir:

Customers CustomerID Name
1 Ahmet
2 Mehmet
3 Ayşe

Orders OrderID CustomerID OrderDate
1 2 2020-01-01
2 3 2020-01-02
3 1 2020-01-03

Yukarıdaki veri tablolarımızda Orders tablosundaki OrderID sütununu Customers tablosundaki CustomerID sütunu ile birleştirdiğimizde bir Inner Join sorgusu oluşturabiliriz. İki tabloda da bulunan ortak kayıtlar aşağıdaki gibi listelenecektir:

CustomerName OrderDate
Ahmet 2020-01-03
Mehmet 2020-01-02
Ayşe 2020-01-01

Inner Join sorgusu, birden fazla veri kaynağından verileri birleştirirken yalnızca ortak olan verileri döndürdüğünden veriler arasındaki ilişkiyi anlamak ve sorguları doğru şekilde yazmak önemlidir.


Left Join

SQL'de olduğu gibi, LINQ içinde de Left Join işlemi kullanılarak iki farklı veri kaynağından tüm kayıtlar birleştirilebilir. Bu işlem ile birlikte ortak olmayan veriler de NULL değerleriyle birleştirilir. Kendi veritabanımızda, örneğin müşteriler tablosu ve siparişler tablosu için Left Join işlemi uygulayacak olursak, tüm müşteri kayıtlarını ve onların siparişlerini listelerken, siparişleri olmayan müşteriler de NULL değeri ile karşımıza çıkacaktır.

Left Join işlemi iç içe sorgular ile birlikte kullanılabilir. Bu işlemi gerçekleştirmek için öncelikle Join işlemi uygulanmalı ve sonrasında DefaultIfEmpty metodu ile ortak olmayan veriler NULL değerleri ile birleştirilmelidir. Örneğin;

Customers Tablosu Orders Tablosu
Ahmet Sipariş 1
Mehmet Sipariş 2
Kemal

Yukarıdaki örnekte, Kemal adlı müşteri için sipariş yoktur. Left Join işlemi uygulandığında;

var result = from customer in customers
        join order in orders on customer.CustomerId equals order.CustomerId into customerOrders
        from order in customerOrders.DefaultIfEmpty()
        select new {
            CustomerName = customer.Name,
            OrderDate = (DateTime?)order.OrderDate
        };

Yukarıdaki kod parçası ile müşterilerin tüm kayıtları ve onların siparişleri listelenirken, siparişleri olmayan müşteriler de listelenir. Siparişleri olmayan müşterilerin OrderDate değerleri NULL değerlidir.


Group Join

Group Join (Grup Eşleştirme), birden fazla tabloya sahip veritabanlarında kullanılan birleştirme yöntemlerinden biridir. Bu yöntemde bir tablo, diğer bir tabloya gruplama yapılarak birleştirilir. Birleştirme sonucunda, birinci tablonun her kaydı, ikinci tablodaki ilgili kayıtlarla eşleştirilir. Grup Join ile birleştirme işlemi gerçekleştirirken, birinci tablonun tüm kayıtları yine listelenirken, ikinci tablodaki ortak olmayan kayıtlar NULL değerleriyle birleştirilir.

Örneğin; bir veri tabanında müşteriler ve siparişleri bulunuyor olsun. Müşteriler tablosunda müşteri adı, siparişler tablosunda da sipariş tarihi ve müşteri kimliği kayıtlı olsun. Grup Join ile bu iki tablo birleştirilebilir ve her bir müşterinin kaç siparişi olduğu gibi bilgileri alınabilir. Üstelik, her müşterinin ne kadarlık bir ciro sağladığı gibi istatistiksel bilgiler de üretilebilir.

Grup Join Örneği
Müşteri Adı Sipariş Sayısı
Müşteri1 3
Müşteri2 2
Müşteri3 1

Yukarıdaki tabloda, müşteri adına ve sipariş sayısına göre birleştirme işlemi gerçekleştirilmiş ve sonuçları listelenmiştir. Group Join ile birleştirme işlemleri kolayca gerçekleştirilebilir ve veritabanındaki farklı tabloların birbirleriyle ilişkilendirilmesi mümkün olur.


Filtreleme İşlemleri

Birçok durumda, aldığımız verileri filtrelememiz gerekiyor. İç içe LINQ sorguları kullanarak, filtreleme işlemlerini de gerçekleştirebiliriz. İşlemlerden bazıları şunlardır:

  • Where: Koşullar belirterek veri kaynaklarını filtrelemek için kullanılır. Örneğin, müşteri adında Maria geçen tüm siparişleri filtrelemek için kullanabiliriz.
  • Order By: Verilerimizi sıralamak istediğimizde kullanılır. Örneğin, ülkeye göre müşterilerimizi alfabetik olarak sıralayabiliriz.
  • Skip: Belirlediğimiz sayı kadar kaydı atlayarak verileri sayfalamak için kullanırız. Örneğin, ilk 50 müşteri kaydını atlayarak sonraki 50 müşteriyi listelemek için kullanabiliriz.
  • Take: Belirlediğimiz sayı kadar kaydı alarak verileri sayfalamak için kullanırız. Örneğin, müşterilerimizin ilk 50 kaydını listelemek için kullanabiliriz.

Bu işlemleri de iç içe sorgular kullanarak gerçekleştirebiliriz. Böylece, verilerimizi hem filtreleyebilir, hem de birleştirebiliriz.


Örnek Kodlar

Bu bölümde, iç içe LINQ sorgularının kullanımı için örnek kodlar sunulacaktır. Bu örneklerde, birden çok veri kaynağından verilerin nasıl sorgulanacağını öğrenebilirsiniz. Aşağıdaki kod örnekleri, birbirinden farklı birden fazla veri kaynağı ile çalışmak isteyen geliştiriciler için oldukça faydalı olacaktır.

Inner Join örneği için:

KodFonksiyon
var result = from customer in customers    join order in orders on customer.CustomerId equals order.CustomerId    select new    {        CustomerName = customer.Name,        OrderDate = order.OrderDate    };
Bu kod, müşteriler ve siparişler veritabanlarından veri çeker ve müşteriler ile siparişler arasındaki ortak kayıtları müşterilerin adı ve sipariş tarihleriyle birlikte gösterir.

Group Join örneği için:

KodFonksiyon
var result = from customer in customers    join order in orders on customer.CustomerId equals order.CustomerId into customerOrders    select new    {        CustomerName = customer.Name,        OrderCount = customerOrders.Count()    };
Bu örnek kod, müşteriler ve siparişler veritabanı tablolarından veri çeker ve müşterileri, müşterinin adı ve sipariş sayısına göre gruplamak için kullanılır. Tamamlanan iş, müşteri adı ve sipariş sayısı ile birlikte ekrana yazdırılır.

Bu kod örnekleri, LINQ sorgularını birleştirirken ve sorgular arasında bağlantı kurarken farklı yollar kullanarak faydalı bilgiler sağlar. Bu örnekler, efektif veri sorgulama teknikleri kullanarak daha özel programlama çözümleri oluşturmak isteyenler için faydalı olacaktır.


Inner Join Örneği

Inner Join örneğinde, toplamda iki farklı veri kaynağı var; customers ve orders. İki veri kaynağı arasında ortak bir alan, yani CustomerId olduğu için bu alan üzerinden Join işlemi gerçekleştiriliyor.

Join işlemi sırasında, her iki veri kaynağındaki tüm kayıtlar taranarak ortak olanlar alınıyor ve yeni bir liste oluşturuluyor. Oluşturulan bu listede yer alan veriler, istenen formatta seçiliyor ve sonuçlar ekrana basılıyor.

Customer Id Customer Name Order Id Order Date
1 John Doe 1001 2022-01-01
2 Jane Smith 1002 2022-01-15
3 Bob Johnson 1003 2022-01-20

Yukarıdaki örneğe baktığımızda, customers ve orders tablolarındaki kayıtların CustomerId alanı üzerinden Join işlemi yapıldığını görüyoruz. Bu sayede oluşturulan yeni listede, her iki tablodaki aynı kayıtlar birleştirilerek istenen formatta seçiliyor.


        join order in orders on customer.CustomerId equals order.CustomerId

Bir LINQ sorgusu içinde Join işlemi, iki farklı veri kaynağından gelen verileri eşleştirmek amacıyla kullanılır. İç içe LINQ sorgularında da bu işlem oldukça sık kullanılır. Örneğin; müşterilerin siparişlerine ulaşmak için müşteriler ve siparişler tablolarını birbirine bağlamak gerekir. Bu işlem şöyle yapılır:

  • İlk adımda, müşteriler tablosundan 'customer' adında bir değişken oluşturulur.
  • İkinci adımda, siparişler tablosundan 'order' adında bir değişken oluşturulur. Bu tabloyla müşteriler tablosu, 'on' ifadesiyle birleştirilir.
  • Üçüncü adımda, müşteri kimliği (CustomerId) alanına göre, iki değişken eşleştirilir (equals).
  • Sonuç olarak, müşteri adı ve sipariş tarihi gibi özelliklerin eşleştirilmesiyle bir veri seti üretilebilir.


        select new {


        select new {

Bir LINQ sorgusu içinde, select new anahtar sözcükleri kullanılarak, sorgu sonucu olarak döndürülecek verilerin şekli belirlenebilir. Bu anahtar sözcüklerine özellikle iç içe sorgular kullanırken ihtiyacımız olacaktır. select new anahtar sözcükleri, sorgudan dönen her bir öğenin hangi özelliklerinin kullanılacağını ve sonucun nasıl oluşturulacağını belirler.

Örneğin, bir inner join sorgusu sonucunda dönen verileri birleştirerek yeni bir nesne oluşturmak isteyebiliriz. Bu yeni nesneyi select new anahtar sözcükleri içinde belirtiriz. Örneğin;

ÖzellikAçıklama
CustomerNameMüşteri adı
OrderDateSipariş tarihi

Yukarıdaki özelliklerin kullanıldığı bir LINQ sorgusunda, select new anahtar sözcükleri şu şekilde oluşturulabilir;

  • var result = from customer in customers
  •         join order in orders on customer.CustomerId equals order.CustomerId
  •         select new {
  •             CustomerName = customer.Name,
  •             OrderDate = order.OrderDate
  •         };
Bu şekilde select new anahtar sözcükleri içinde belirtilen özelliklerle, inner join işleminden dönen verileri birleştirebilir ve yeni bir nesne oluşturabiliriz. Benzer şekilde, group join işleminden dönen verileri de select new anahtar sözcükleri ile birleştirilebilir ve yeni bir nesne oluşturulabilir.


            CustomerName

Bir LINQ sorgusu içinde birden fazla veri kaynağı kullanmak istediğimizde, ortak bir öğe işaretleyerek birleştirme işlemi gerçekleştiririz. Bu örnekte, customer.Name ve order.CustomerId alanları birleştirilerek Inner Join işlemi gerçekleştirilir.

Customer Name Order Date
John 2021-04-12
Emily 2021-05-01
Mike 2021-05-21

Kod satırlarına bakarsak, "customer" ve "order" kaynakları ile işlem yapmak için "join" anahtar sözcüğü kullanılır. CustomerId alanı ile eşleşen veriler birbirleriyle birleştirilir ve yeni bir şekil oluşturulur. "select" anahtar sözcüğü sonuçları döndürür.


            OrderDate

OrderDate = order.OrderDate

Bu kod, Inner Join örneğinde kullanılan bir filtreleme işlemidir. Sorgulanan iki farklı veri kaynağından müşterilerin isimlerini ve sipariş tarihlerini getirir. Bu sayede, müşterilerin hangi tarihte hangi siparişi verdiği bilgisi elde edilebilir.

Sorgu sonucunda, müşterilerin isimleri ve sipariş tarihleri birlikte listelenir. Örneğin, John adlı müşterinin 05.01.2022 tarihinde bir siparişi olduğu bilgisi döndürülebilir. Bu filtreleme işlemi, veriler arasında doğru kesişimin yapılmasına yardımcı olur ve istediğimiz bilgilere daha hızlı ve kolay erişim sağlar.


        };

Bu örnek kodlar, iç içe LINQ sorgularının farklı veri kaynakları arasında nasıl kullanılabileceğini göstermektedir. Inner Join örneği, müşteri verilerini ve sipariş verilerini birleştirerek sonuçları filtreler. Group Join örneği, müşteri verilerini ve sipariş verilerini birleştirir ve müşteri adı ve sipariş sayısı gibi faktörleri içeren bir sonuç kümesi döndürür. Bu kod örnekleri endüstride sıkça kullanılan sorgulama işlemlerini göstermektedir.


Group Join Örneği

Group Join Örneği

Bu örnekte, iç içe LINQ sorguları kullanarak bir veri kaynağı diğer bir veri kaynağına gruplama yaparak birleştirilir. Group join ile ortak olmayan veriler de listelenir. Bu örnekte "customers" ve "orders" veri kaynakları kullanılacaktır.

Customers Orders
CustomerId Name OrderId
C001 Ahmet O001
C001 Ahmet O003
C002 Mehmet O002

Aşağıdaki kod satırları "customers" veri kaynağından "orders" veri kaynağına gruplama yaparak birleştirir. Sonuçta, sipariş veren müşterilerin isimleri ve sipariş sayıları listelenir.

 var result = from customer in customers              join order in orders on customer.CustomerId equals order.CustomerId into customerOrders              select new {                   CustomerName = customer.Name,                   OrderCount = customerOrders.Count()              };
  • join order in orders on customer.CustomerId equals order.CustomerId sorgusu, "customers" veri kaynağından "orders" veri kaynağına birleştirme işlemini gerçekleştirir.
  • into customerOrders sorgusu, gruplama işlemi yaparak "orders" veri kaynağındaki siparişleri müşteriye göre gruplar.
  • select new { ... } sorgusu, sonuçları yeni bir nesne olarak seçer. Bu örnekte, müşteri adı ve sipariş sayısı seçilir.

Bu örnek kodu kullanarak, birden fazla veri kaynağından alınan verilerin gruplama yapılarak birleştirilmesi mümkün hale gelir.


        join order in orders on customer.CustomerId equals order.CustomerId into customerOrders

Birden çok veri kaynağından aldığımız verileri filtrelemek ve birleştirmek için iç içe LINQ sorguları kullanabiliriz. Inner Join, Left Join ve Group Join gibi çeşitli birleştirme işlemleri iç içe sorgularla gerçekleştirilebilir. Örneğin, join order in orders on customer.CustomerId equals order.CustomerId into customerOrders işlemi ile Customer tablosu ile Order tablosu birleştirilebilir. Bu işlem Group Join olarak adlandırılır.

Group Join işlemi, bir veri kaynağını, diğer bir veri kaynağına gruplama yaparak birleştirir. Bu işlem, Inner Join ve Left Join işlemlerinden farklıdır. Ortak olmayan veriler de listelenir. Inner Join işlemi sadece ortak olan kayıtları birleştirirken, Left Join işlemi ise iki veri kaynağından tüm kayıtları birleştirir. Ortak olmayan kayıtlar NULL değerleriyle birleştirilir. Aşağıda Group Join işlemine örnek kod parçası verilmiştir:

          var result = from customer in customers      join order in orders on customer.CustomerId equals order.CustomerId into customerOrders      select new {        CustomerName = customer.Name,        OrderCount = customerOrders.Count()      };      

        select new {


        select new {

Birden çok veri kaynağından herhangi birinin özelliklerini birleştirmek ve yeni bir veri seti oluşturmak için select new kullanılır. Bu işlem, verileri daha düzenli ve okunaklı hale getirir. Örnek kodlar bize bu konuda yardımcı olabilir. Inner Join örneğinde, select new, müşteri adı ve sipariş tarihi özelliklerini birleştirerek yeni bir veri seti oluşturur. Group Join örneğinde, select new, müşteri adı ve sipariş sayısı özelliklerini birleştirerek yeni bir veri seti oluşturur.

Birden çok kaynaktan veri çekerken, select new işleminin yanı sıra, çıktılarınızı sınırlamak ve özelleştirmek için diğer LINQ sorgularını da kullanmanız gerekir. Bu, verileri ayrıştırmak ve yönetmek için oldukça faydalıdır.

Bu nedenle, iç içe LINQ sorguları hem birleştirme işlemleri hem de filtreleme işlemleri için kullanılabilir. Birleştirme işlemleri sayesinde verileri farklı kaynaklardan birleştirir ve filtreleme işlemleri ile de bu verileri sınırlarız ve ihtiyacımıza göre özelleştirebiliriz.


            CustomerName

Bu örnekte inner join kullanarak, 'customers' ve 'orders' veri kaynakları içindeki ortak değerleri birleştirip, customer adı ve sipariş tarihlerini seçiyoruz:

CustomerName OrderDate
Mehmet 06/15/2021
Ahmet 06/16/2021
Ayşe 06/14/2021

Bu kod, veri kaynaklarında ortak olan bilgileri birleştirerek yeni bir liste oluşturuyor. 'customers' kaynağından 'name' özelliğini ve 'orders' kaynağından 'orderDate' özelliğini seçiyoruz ve yeni bir obje döndürüyoruz. Bu obje, customerName ve orderDate özelliklerinden oluşan bir liste içeriyor.

İç içe LINQ sorguları, birden fazla veri kaynağından verileri birleştirerek, kompleks filtreleme işlemleri gerçekleştirmemize olanak tanır. Inner join, left join ve group join gibi birleştirme işlemlerini iç içe sorgularla yapabiliriz. Ayrıca where, order by, skip, take gibi filtreleme işlemleri de iç içe LINQ sorguları ile yapılabilir. Yukarıdaki örnek kodlar, bu işlemleri nasıl gerçekleştireceğimize dair fikir vermektedir.


            OrderCount

Group Join işlemi, bir veri kaynağını ve o veri kaynağındaki öğelerin sayısını diğer veri kaynağına gruplayarak birleştiren bir iç içe LINQ sorgusu işlemidir. Bu işlemde, ortak veriler birleştirilirken, ortak olmayan veriler de listelenir.

Yukarıda verilen örnekte, toplam sipariş sayısını müşteri adıyla birleştirdik. Group Join işlemi, birleştirme işleminin yanı sıra filtreleme işlemi olarak da kullanılabilir. Örneğin, belirli bir tarihten önceki siparişleri listelemek için Where sorgusu ekleyebilirsiniz.

Müşteri Adı Sipariş Sayısı
Ahmet 2
Mehmet 1
Ayşe 0

        };

Bu kod parçacığı, Group Join örneğindeki sorgu sonuçlarını içermektedir. Customers ve Orders veri kaynaklarından, CustomerId alanına göre birleştirme yaparak CustomerName ve OrderCount bilgilerini seçer.