Bu makalede, LINQ sorgularında Where, Select ve OrderBy olmak üzere üç temel kavramın yanı sıra, Anonymous Types, SelectMany, OrderByDescending, ThenBy ve ThenByDescending gibi ileri seviye sorgu kavramları hakkında bilgi verilecek LINQ, NET Framework'un bir parçasıdır ve veri sorgulama imkanı sunarken, C# ve VBNET gibi NET dillerinde yazılabiliyor Where sorgusu, veri kaynağı üzerinde koşullara göre filtreleme yapmamızı sağlarken, Select sorgusu belirli özellikleri seçerek yeni bir veri kümesi veya özellik kümesi oluşturmamıza olanak sağlar OrderBy ise veri kaynağını belirli bir özelliğe göre sıralamamıza yarar Anonymous Types kullanımı sayesinde sadece gerekli özelliklere erişim sağlayabiliriz SelectMany, çoklu koleksiyonlarda veri seçmek için kullanılan bir sorgulama aracıdır OrderByDescending, bir sorguyu büyükten küçüğe doğru sı

LINQ, .NET Framework'ün bir parçası olarak sunulan bir sorgulama aracıdır. LINQ, SQL diline benzer şekilde veri sorgulama imkanı sunarken, bu sorguları C# ve VB.NET gibi .NET dillerinde yazmamıza olanak tanır. Bu makalemizde, LINQ sorgularındaki temel sorgu kavramlarını ve bu kavramların kullanım örneklerini ele alacağız.
Öncelikle LINQ sorgularının temel sorgu kavramlarını inceleyelim. LINQ sorguları genellikle Where, Select, ve OrderBy olmak üzere üç temel kavram üzerine kuruludur. Where, veri kaynağı üzerinde koşullara göre filtreleme yapmamızı sağlar. Select, belirli özellikleri seçerek yeni bir veri kümesi veya özellik kümesi oluşturmamızı sağlar. OrderBy ise veri kaynağını belirli bir özelliğe göre sıralamamızı sağlar.
Bu makalede, bu temel kavramların yanı sıra Anonymous Types ve SelectMany gibi ileri seviye sorgu kavramları hakkında da bilgi vereceğiz. Ayrıca, OrderByDescending, ThenBy ve ThenByDescending gibi OrderBy sorgusuna bağlı olan kavramlar hakkında da bilgi sahibi olacaksınız.
Where Sorgusu
Where Sorgusu, LINQ sorguları arasında en yaygın olarak kullanılan sorgulardan biridir. Veri kaynağı üzerinde koşullara göre filtreleme yapmamızı sağlar. Kullanımı oldukça basittir ve sorgu ifadesi içerisinde koşul ifadesi yazılır. Örneğin, bir öğrenci listesi üzerinde sadece notu 70'in üzerinde olan öğrencilerin listesini almak için aşağıdaki kodu kullanabiliriz:
Örnek Kod | Çalışma Mantığı |
---|---|
var notuYuksekOgrenciler = from ogrenci in OgrenciListesi where ogrenci.Notu >= 70 select ogrenci; | Burada OgrenciListesi adındaki koleksiyon üzerinde koşul ifadesi ile sadece notu 70 ve üzeri olan öğrencileri seçiyoruz. |
Where sorgusu ile birden fazla koşul ifadesi de kullanabiliriz. Örneğin, öğrencilerin hem notları hem de yaşlarına göre filtreleme yapmak istediğimizde aşağıdaki kodu kullanabiliriz:
Örnek Kod | Çalışma Mantığı |
---|---|
var notuVeYasiYuksekOgrenciler = from ogrenci in OgrenciListesi where ogrenci.Notu >= 70 && ogrenci.Yasi >= 18 select ogrenci; | Burada OgrenciListesi adındaki koleksiyon üzerinde iki koşul ifadesi kullanarak hem notu 70 ve üzeri olan hem de yaşları 18 ve üzeri olan öğrencileri seçiyoruz. |
Where sorgusu, herhangi bir veri tipindeki veri kaynakları üzerinde kullanılabilir ve oldukça esnek bir yapıya sahiptir. Kullanımı sayesinde veri kaynaklarında filtreleme işlemleri çok daha kolay hale gelir.
Select Sorgusu
Select sorgusu, LINQ sorgularında en önemli sorgu türlerinden biridir. Bu sorgu türü, belirli özellikleri seçerek yeni bir veri kümesi veya özellik kümesi oluşturmamızı sağlar. İki temel kullanım şekli vardır. Birincisi, var olan nesneler üzerinde belirli özellikleri seçerek yeni bir koleksiyon oluşturmak. İkincisi ise, var olan nesnelerin sadece belirli özelliklerine erişmek. Bu sayede, veritabanı üzerinde gereksiz bilgi yüklenmez ve daha hızlı sorgu işlemi gerçekleşir.
Select sorgusu, özellikle büyük veri kümelerinde önemli bir rol oynar ve sorgu işleminin hızını artırır. Bu sorgu türünün kullanımı oldukça kolaydır ve LINQ ifadelerinde yaygın olarak kullanılır. Ayrıca anonymous types kullanımı ile daha etkili hale getirilebilir.
- Anonymous Types Kullanımı: Select sorgusu ile oluşturulan anonymous types yapısı, belirli özellikleri seçerek yeni bir veri kümesi veya özellik kümesi oluşturmamıza olanak sağlar. Bu yapının kullanımı sayesinde, gereksiz verileri bünyesinde barındıran nesnelere ihtiyaç duymadan sadece gerekli özelliklere erişim sağlayabiliriz.
- Dinamik Olarak Anonymous Types Oluşturma: Select sorgusu ile oluşturulan anonymous types yapısını daha etkili hale getirmek için dinamik olarak oluşturulabilir. Bu yöntem ile, sorgu sonrası oluşan anonymous types yapısına dinamik bir şekilde erişebilir ve ihtiyaç duydukça kullanabiliriz.
- Join İşleminde Anonymous Types Kullanımı: Join işlemi yaparken oluşan anonymous types yapısı sayesinde birleştirilmiş veriler arasında kolaylıkla erişim sağlanabilir. Bu nedenle Join işleminde anonymous types yapısının kullanımı oldukça önemlidir.
Bu şekilde Select sorgusu; koleksiyonların önemli bir yönetim aracı haline gelir. Veritabanı işlemleri için sıklıkla kullanılan sorgu türlerinden biri olan Select sorgusu sayesinde gereksiz bilgi yüklemesi önlenebilir ve hızlı sorgu işlemi gerçekleştirilebilir.
Anonymous Types Kullanımı
Select sorgusu, belirli özellikleri seçerek yeni bir veri kümesi veya özellik kümesi oluşturmamızı sağlar. Bu yeni veri kümesinin yapısı, belirli özellikleri içeren anonim bir nesne olarak adlandırılır. Böylece, bu anonim nesneleri belirli bir sorgu sonucunda oluşan veri kümesinde kullanabiliriz.
Select sorgusunu kullanarak anonymous types yapısı oluştururken, özelliklerin adlarını ve veri tiplerini belirlememiz gerekir. Bu özellikleri, Select sorgusunun sonunda süslü parantezler içinde bir liste halinde belirtiriz. Örneğin:
var products = from p in db.Products select new { ProductName = p.ProductName, Price = p.Price };
Bu sorguda, veritabanındaki Products tablosundaki ProductName ve Price özelliklerini seçiyoruz. Seçilen özellikleri, yeni bir anonymous type yapısı oluşturarak ProductName ve Price özellikleri ile birlikte kullanabiliriz.
Anonymous types yapısını oluştururken, veri tiplerini belirlemeden önce verileri döndüren sorgudaki veri tiplerine göre belirleme yapar. Bu nedenle, bu yapılarda tip tanımlaması yapamayız. Sadece sorgudan elde edilen verileri kullanabiliriz.
Özetle, Select sorgusu ile oluşturulan anonymous types yapısı, belirli özellikleri içeren anonim bir nesne olarak tanımlanır. Ana sorgudan belirli özellikleri seçerek yeni bir veri kümesi oluşturulur ve bu veri kümesi, oluşturulan anonymous types yapısı içinde kullanılır.
Dinamik Olarak Anonymous Types Oluşturma
Bir önceki bölümde Select sorgusu ile oluşturulan anonymous types yapısının ne olduğuna değindik. Bu bölümde ise Select sorgusu ile oluşturulan bu yapıların static olmayan şekilde nasıl kullanılabileceğini ele alacağız.
Temel olarak, dinamik olarak anonymous types yapısı oluşturmak için var keywordunu kullanıyoruz. Böylece, runtime sırasında oluşturulan bir object ile çalışabiliriz. Bu, kodu daha okunaklı ve esnek hale getirir. Ayrıca, bu yöntem sayesinde değişebilir bir yapı elde etmiş oluruz.
Örneğin, bir müşteri listesi alırken Select sorgusu kullanarak yetki durumunu da müşteri nesnesine ekleyebiliriz. Bunu şu şekilde yapabiliriz:
Müşteri Adı | Yetki Durumu |
---|---|
Ali | Admin |
Ayşe | User |
Can | User |
Bu örnekte, Select sorgusu ile yeni bir anonymous types yapısını oluşturuyoruz. Daha sonra, bu yapının Yetki Durumu özelliğini değiştirebiliriz. Bu sayede, sorgu sonucunda döndürülen ve static bir şekilde tanımlanmış olan anonymous types yapısına ek özellikler ekleyebiliriz.
Dinamik olarak anonymous types yapısı oluşturma, kodu daha esnek hale getirir ve daha özelleştirilmiş bir sonuç elde etmenizi sağlar. Bu sayede, LINQ sorguları size daha fazla fırsat sunar ve daha işlevsel hale getirir.
Join İşleminde Anonymous Types Kullanımı
Join işlemi, birden fazla veri kümesi içerisinde belirlenen bir eşleme kriterine göre öğeleri birleştirir. Join işlemi sırasında oluşturulan anonymous types yapısı, ilgili verilerin birleştirilmesinde büyük bir avantaj sağlar. Birleştirilen verilerin yapısı farklı olsa bile, Join işlemi sonucunda oluşturulan yeni bir yapı sayesinde verilerin eşlenmesi sağlanır.
Join işlemi sonrasında oluşan anonymous types yapısı, seçilen özellikler ve veriler üzerinde filtreleme, sıralama ve gruplama yapılmasında kullanılabilir. Bu sayede veri manipülasyonu daha etkili bir şekilde gerçekleştirilebilir.
Join işlemi sırasında oluşan anonymous types yapısının kullanımı, LINQ sorgularında oldukça sık karşılaşılan bir durumdur. Bu yüzden, Join işlemine yönelik Anonymous Types yapısının kullanımının doğru bir şekilde öğrenilmesi, LINQ sorgularının daha verimli bir şekilde yazılmasını sağlar.
SelectMany Sorgusu
SelectMany sorgusu, birden fazla koleksiyon üzerinde işlem yapabilmemizi sağlar. Bu sayede örneğin bir liste içerisindeki bir veriyi, başka bir listedeki veri ile eşleştirebiliriz. Bu sorgu, birden fazla koleksiyon üzerinde gezinirken verilerin nasıl birleştirileceğini tanımlamamızda kullanılır.
Bir örnek vermek gerekirse, bir kişinin ad, soyad, adres, şehir ve telefon numarası bilgilerini içeren bir sınıfımız olsun. Bu sınıfın bir listesi diğer listedeki kişileri temsil ediyor olsun ve bu listede sadece ad, soyad ve telefon numarası bilgileri var olsun. Bu gibi durumlarda SelectMany sorgusu sayesinde birbirine benzeyen ve eşleştirilebilecek verileri bir araya getirebiliriz.
Bir örnekle devam edelim. Diyelim ki bir tane anahtar kelimeler, anahtar kelimelerin tarihleri, anahtar kelimelerin trafik değerlerinin tutulduğu bir dizi veri kaynağına sahibiz ve bu verileri birleştirmek istiyoruz. Bunun için ilk önce bir ya da birden fazla koleksiyon seçilerek SelectMany sorgusu kullanılır. Ardından ilgili koleksiyonlar üzerinde gezinilerek, verilerin nasıl birleştirileceği belirlenir. Örneğin anahtar kelime zaman çizelgesinde birden fazla trafik verisine sahip olabilir, bu verileri bir araya getirmek için SelectMany kullanılabilir.
Bir örneğe daha bakacak olursak, üniversite kayıt işlemleri sırasında, bir öğrencinin kurslarının kaydını almak istediğimizi varsayalım. Her öğrenci birden fazla ders alabilir ve bu dersler de birden fazla öğretmene kayıtlı olabilir. SelectMany sorgusu kullanarak, öğrenci ve ders detaylarının yanı sıra öğretmen bilgilerini de ekleyebiliriz. Bu sayede veriler arasında bağlantı kurabiliriz.
Özet olarak, SelectMany sorgusu, birden fazla koleksiyon üzerinde gezinirken verilerin nasıl birleştirileceğini tanımlamamız için kullanılır. Bu sorgu sayesinde farklı koleksiyonlardaki verileri birleştirerek daha kapsamlı bir veri kümesi oluşturabiliriz.
OrderBy Sorgusu
SQL sorgu dili içinde yer alan OrderBy sorgusu, LINQ sorgu dilinde de tanımlanmıştır. Bu sorgu, veri kaynağını belirli özelliklerine göre sıralamak için kullanılır. Sıralamanın yapılabilmesi için OrderBy sorgusu ile birlikte belirtilen özelliklerin, sıralama için uygun veri tipine sahip olması gereklidir.
Bir örnek üzerinden gidersek, bir film veritabanında yer alan filmleri sıralamak için film adına göre sıralama yapılabilir. Bunun için aşağıdaki LINQ sorgusu kullanılabilir:
Listfilmler = GetFilmler(); //Veritabanından filmleri getir.var sıralanmışFilmler = filmler.OrderBy(f => f.Ad);
Yukarıdaki örnekte, GetFilmler() fonksiyonu ile veritabanından filmler getirilir ve OrderBy sorgusu ile film adına göre sıralanır.
OrderBy sorgusunun kullanımı oldukça basittir. Ancak birden fazla sıralama kriterine ihtiyaç varsa, bunun için ThenBy sorgusu kullanılabilir. Ayrıca sıralamanın ters çevrilmesi için OrderByDescending sorgusu kullanılır.
Tablo 1:OrderBy sorgusu kullanımı
Metot | Açıklama |
---|---|
OrderBy | Bir sıralama anahtarı seçer ve öğelerin sıralı bir sürümünü döndürür. |
Bu sorgu, veri kaynağının belirtilen özelliklerine göre sıralama yapmak için oldukça kullanışlıdır. Ancak veri kaynağının büyük olduğu durumlarda performans problemlerine sebep olabilir. Bu nedenle, büyük veri kümeleri için farklı sorgu stratejileri kullanmak gerekebilir.
OrderByDescending Sorgusunun Kullanımı
OrderByDescending sorgusu, sıralama işlemini tersine çevirerek belirli bir sıralamaya göre veri kaynağını azalan şekilde sıralamamızı sağlar. Bu sorgu SelectMany sorgusu gibi birden fazla özelliği sıralamak için kullanılabilir.
OrderByDescending kullanımı için öncelikle sıralama yapılması gereken özellik belirlenir ve ardından OrderByDescending metodu kullanılarak veri sıralanır. Örnek olarak, bir öğrenci listesi üzerinde sıralama yapacak olursak ve öğrencilerin notlarına göre sıralanmasını istiyorsak aşağıdaki gibi bir sorgu kullanabiliriz:
Öğrenci Adı | Notu |
---|---|
Ahmet | 70 |
Mehmet | 85 |
Fatma | 65 |
Ayşe | 90 |
Yukarıdaki örnekte, öğrencilerin notlarına göre sıralama yapmak istersek OrderByDescending sorgusunu kullanarak notların azalan sıralamaya göre sıralanmasını sağlayabiliriz:
- var sıralıListe = öğrenciListesi.OrderByDescending(öğrenci => öğrenci.Notu);
Bu kod örneğinde, öğrenci listesinde her bir öğrenci elemanının "Notu" özelliği kullanarak azalan sıralama yapılması sağlanır.
Böylece, OrderByDescending sorgusu kullanarak veri kaynağını azalan sıralamaya göre sıralayabilir, istediğimiz özelliğe göre filtreli veri kümesi oluşturabilir ve birden fazla özellik üzerinde sıralama yapabiliriz.
ThenBy Sorgusu
OrderBy sorgusu ile veri kaynağı belirli bir özelliğe göre sıralanabilir. Ancak bazen sıralama yaparken birden fazla özellik kullanmak isteyebiliriz. Bu durumda, ikinci bir sıralama kriteri için ThenBy sorgusu kullanılır.
Örneğin, bir müşteri listemiz var ve müşterileri önce soyadlarına göre ve ardından isimlerine göre alfabetik olarak sıralamak istiyoruz. Bunun için, öncelikle OrderBy sorgusunu soyadı özelliğine göre kullanacağız. Daha sonra, aynı soyadına sahip müşterileri isimlerine göre sıralamak için ThenBy sorgusunu kullanacağız.
Müşteri Adı | Müşteri Soyadı |
---|---|
Ahmet | Can |
Ahmet | Göçer |
Ali | Karaca |
Ali | Sönmez |
Mehmet | Akyol |
Mehmet | Çetin |
Yukarıdaki tabloyu soyadına göre sıralamak için şu sorguyu yazabiliriz:
var sıralıMüşteriler = müşteriler.OrderBy(m => m.Soyadı).ThenBy(m => m.Adı);
Bu sorgunun sonucunda, önce soyadına göre alfabetik olarak sıralanmış müşteriler, ardından isimlerine göre alfabetik olarak sıralanmış müşteriler yer alacak.
ThenByDescending sorgusu da aynı şekilde kullanılabilir. Bu sorgu ile ikinci bir sıralama kriteri azalan sıraya göre sıralanabilir.
ThenByDescending Sorgusu
OrderBy sorgusu ile sıralanmış olan verilerde her zaman birinci öncelikle sıralama yapılır. İkinci bir öncelik için ThenByDescending sorgusu kullanılır. Bu sorgu, verileri belirlenen ikinci özelliklere göre sıralar ve bu sıralamayı azalan sıraya göre yapar.
Örneğin bir ürün listesi sıralandıktan sonra, varsa fiyata göre ikinci bir sıralama yapmak isteyebiliriz. Bu durumda sıralamanın azalan fiyat sırasına göre yapılması için ThenByDescending sorgusunu kullanabiliriz.
Ürün | Fiyat |
---|---|
Telefon | 3000 |
Bilgisayar | 5000 |
Televizyon | 4000 |
Yukarıdaki örnekte, fiyata göre sıralama yapılmış ürünlerin bir de azalan fiyat sırasına göre sıralanması istenirse, ThenByDescending sorgusu kullanılabilir. Böylece, ürünler fiyata göre önce artan, sonra da azalan sıraya göre sıralanmış olacaklardır.