Language INtegrated Query yani “dile entegre olmuş sorgulama” olarak bilinen LINQ programcıya veri tabanı ortamlarında kullanılan SQL diline benzer şekilde veri sorgulama imkanı veren bir .NET veri sorgulama yöntemidir. C# 3.0 ve .NET Framework 3.5 aracılığıyla tanıştığımız LINQ ilk çıktığı günden bu yana sıklıkla kullanılmaktadır. Gelecek sayılarımızda derinlemesine inceleyeceğimiz son yılların en popüler konularından biri olan Entity Framework kavramının da temel unsurlarından birini oluşturmasından ötürü .NET programcıları tarafından mutlak suretle iyi anlaşılması ve özümsenmesi gereken bir konudur.
LINQ ile .NET nesneleri içeren liste ve benzeri yapıları, daha doğrusu IEnumerable veya IEnumerable<> ara-yüzlerini destekleyen yapıları, arzu edilen alanlar üzerinden filtreleyebilir, liste içindeki nesneleri dinamik bir şekilde başka yapı- lara çevirerek seçebilir, liste elemanları üzerinde toplam, ortalama, maksimum, minimum vb. hesaplamalar yapabilir ve değişik tipte yapıları barındıran farklı liste bazlı yapıları ortak alanlar üzerinden birbirine bağlama/ilişkilendirme gibi işlemleri gerçekleştirebiliriz.
LINQ cümleleri iki değişik şekilde yazılabilirler:
- Sorgu yöntemi
- Metot-lambda ifadeleri (lambda expressions) yöntemi
Bu iki yöntemi yakından incelemeye başlamadan önce örneklerimizde veri kaynağı olarak kullanmak üzere aşağıdaki listeyi tanımlayalım:
List<int> liste = new List<int>{1, 2, 3, 4, 5, 6, 7};
Şimdi bu listeden sorgu yöntemini kullanarak 3 rakamından büyük değerleri birer string olarak seçelim.
IEnumerable<string> sonuç = from x in liste //veri kaynağı ve değişken tanımı
where x > 3 //koşul ile filtreleme
orderby x descending //sırala (büyükten küçüğe)
select x.ToString(); //veri seçimi
NOT: LINQ ve ilgili yapıları kullanabilmek için projelerimizde System.Core.dll sınıf kütüphanesine referans ekleyerek System.Linq alan-adına erişebiliyor olmamız gerekir.
Yukarıdaki örnekte de görüldüğü gibi sorgu yöntemiyle yazılan LINQ cümleleri aşağıdaki taslakta yazılırlar:
IEnumerable<sonuçTip> sonuç = from değişkenAdı in veriKaynağı
where koşulİfadesi
orderby sıralamaİfadesi descending / ascending
select seçimİfadesi;
Yukarıdaki formatı irdeleyelim:
değişkenAdı :Bizim seçeceğimiz herhangi bir değişken adı. Bu değişken adı foreach döngülerinde tanımlanan yineleme değişkeni gibi düşünebilir ve diğer ifadelerde liste elemanlarına referans yapma imkanı tanır.
koşulİfadesi : true ya da false döndürecek koşul.
sıralama İfadesi : tip kısıtlaması olmayan ve sıralamada kullanılacak bir değer döndürecek ifade.
seçim İfadesi : sonuç listesinde tutulacak sonuçTip tipindeki nesneleri belirleyenifade.
Bu tanımlar arasında sanırız en önemli kavram seçimİfadesi ve sonuçTip arasındaki ilişkidir. LINQ cümlelerinde atamanın sol tarafında ne olacağı seçimİfadesi’ne bağlıdır, veri kaynağına değil. Örneğimizde veri kaynağımız int değer- lerden oluşan bir liste olduğu halde x.ToString() ile yaptığımız seçim bize IEnumerable<string> tipinde bir sonuç vermektedir.
Şimdi metot-lambda ifadeleri yöntemiyle yukarıdaki LINQ cümlesine işlev- sel olarak eşdeğer olan aşağıdaki cümleyi yazalım:
IEnumerable<string> sonuç = liste.Where(x => x > 3)
.OrderByDescending(x => x)
.Select(x => x.ToString());
Yukarıda yazdığımız LINQ cümleleri (sorgu ve metot-lambda yöntemleri) liste değişkeninden x > 3 koşulunu sağlayan elemanları tespit eder, bunları büyük- ten küçüğe doğru sıralar ve birer string olarak seçerek oluşan yeni listeyi sonuç değişkenine aktarır.
sonuç değişkenindeki değeri görüntüleyecek olursak sonuç şu olacaktır:
"7", "6", "5", "4"
Kaynak: F5 Dergisi