LINQ Sorgularına Giriş (C#)
Sorgu, veri kaynağından veri alan bir ifadedir. Sorgular genellikle özelleştirilmiş bir sorgu dilinde ifade edildi. İlişkisel veritabanları ve XML için XQuery gibi çeşitli veri kaynakları SQL farklı diller geliştirilmiştir. Bu nedenle, geliştiricilerin desteklemesi gereken her veri kaynağı türü veya veri biçimi için yeni bir sorgu dili öğrenmesi gerekmektedir. LINQ, çeşitli veri kaynakları ve biçimler arasında verilerle çalışmak için tutarlı bir model sunarak bu durumu basitleştiriyor. LINQ sorgusunda her zaman nesnelerle çalışıyor olurnuz. XML belgeleri, SQL veritabanları, ADO.NET Veri Kümeleri, .NET koleksiyonları ve LINQ sağlayıcısının kullanılabilir olduğu diğer biçimlerde verileri sorgulamak ve dönüştürmek için aynı temel kodlama desenlerini kullanırsınız.
Bir Sorgu İşleminin Üç Bölümü
Tüm LINQ sorgu işlemleri üç ayrı eylemden oluşur:
Veri kaynağını alın.
Sorguyu oluşturun.
Sorguyu çalıştırın.
Aşağıdaki örnek, bir sorgu işlemi üç parçasının kaynak kodda nasıl ifade edildiklerini gösterir. Örnekte kolaylık sağlamak için veri kaynağı olarak bir tamsayı dizisi kullanılır; ancak, aynı kavramlar diğer veri kaynakları için de geçerlidir. Bu örnek, bu konunun geri kalanında anılan bir örnektir.
class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % 2) == 0
select num;
// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}
Aşağıdaki çizimde tüm sorgu işlemi gösterilmiştir. LINQ'te sorgunun yürütülmesi sorgudan farklıdır. Başka bir deyişle, yalnızca bir sorgu değişkeni oluşturarak veri almamıştınız.

Veri Kaynağı
Önceki örnekte, veri kaynağı bir dizi olduğundan, genel arabirimi örtülü olarak IEnumerable<T> destekler. Bu durum, LINQ ile sorgulan bir durum olduğu anlamına gelir. Sorgu deyiminde yürütülür foreach ve veya foreach IEnumerable IEnumerable<T> gerektirir. Destekleyen türler IEnumerable<T> veya genel gibi türetilmiş bir IQueryable<T> arabirime sorgulanabilir türler denir.
Sorgulanabilir bir tür, LINQ veri kaynağı olarak görev yapmak için değişiklik veya özel işlem gerektirir. Kaynak veriler sorgulanabilir bir tür olarak bellekte yoksa LINQ sağlayıcısı bunu bu şekilde temsilmalıdır. Örneğin, LINQ to XML xml belgesini sorgulanabilir bir türe XElement yükler:
// Create a data source from an XML document.
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");
ile, ilk olarak tasarım zamanında el ile veya LINQ to SQL LINQ - SQL Tools'daki Visual Studio. Sorgularınızı nesnelere yazarsınız ve çalışma zamanında LINQ - SQL veritabanıyla iletişimi ele alırsınız. Aşağıdaki örnekte, veritabanındaki belirli bir tabloyu temsil eder ve sorgu sonucu türü olan Customers IQueryable<T> , türünden türettir. IEnumerable<T>
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
// Query for customers in London.
IQueryable<Customer> custQuery =
from cust in db.Customers
where cust.City == "London"
select cust;
Belirli veri kaynağı türlerini oluşturma hakkında daha fazla bilgi için çeşitli LINQ sağlayıcılarının belgelerine bakın. Ancak, temel kural çok basittir: LINQ veri kaynağı, genel arabirimi destekleyen herhangi bir nesne veya bundan devralınan IEnumerable<T> bir arabirimdir.
Not
Genel olmayan ArrayList arabirimi destekleyen türler IEnumerable LINQ veri kaynağı olarak da kullanılabilir. Daha fazla bilgi için bkz. LINQ ile ArrayList sorgulama (C#).
Sorgu
Sorgu, veri kaynağından veya kaynaklardan hangi bilgilerin alınmalıdır? İsteğe bağlı olarak, bir sorgu bu bilgilerin döndürülmeden önce nasıl sıralandır, gruplandır ve şekillendir gerektiğini de belirtir. Sorgu bir sorgu değişkende depolanır ve sorgu ifadesiyle başlatılır. C# ile sorgu yazmayı kolaylaştırmak için yeni sorgu söz dizimi tanıtıldı.
Önceki örnekteki sorgu, tamsayı dizisinde yer alan tüm doğru sayıları döndürür. Sorgu ifadesi üç yan tümcesi içerir: from , where ve select . (Yan tümceleri SQL yan tümcelerinin sıralamanın, SQL.) yan tümcesi veri kaynağını belirtir, yan tümcesi filtreyi uygular ve yan from where select tümcesi döndürülen öğelerin türünü belirtir. Bunlar ve diğer sorgu yan tümceleri Language Integrated Query (LINQ) bölümünde ayrıntılı olarak ele alınmıştır. Şimdilik önemli nokta, LINQ'te sorgu değişkeninin hiçbir eylemde yer alamayarak veri döndüren bir değer oluşturmasıdır. Sorgu daha sonraki bir noktada yürütülürken sonuçları üretmek için gereken bilgileri depolar. Sorguların arka arkasında nasıl oluşturulmuş olduğu hakkında daha fazla bilgi için bkz. Standart Sorgu İşleçleri'ne Genel Bakış (C#).
Not
Sorgular yöntem söz dizimi kullanılarak da ifade olabilir. Daha fazla bilgi için bkz. LINQ'te Sorgu Söz Dizimi ve Yöntem Söz Dizimi.
Sorgu Yürütme
Ertelenmiş Yürütme
Daha önce belirtildiği gibi sorgu değişkeninin kendisi yalnızca sorgu komutlarını depolar. Sorgunun gerçek yürütmesi, bir deyiminde sorgu değişkeni üzerinde tekrar yapılana kadar foreach ertelenmiştir. Bu kavram ertelenmiş yürütme olarak adlandırılır ve aşağıdaki örnekte gösterildi:
// Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
deyimi foreach de sorgu sonuçlarının alınarak elde edildi. Örneğin, önceki sorguda yineleme değişkeni, döndürülen dizide her değeri num (tek tek) tutar.
Sorgu değişkeninin kendisi hiçbir zaman sorgu sonuçlarının içinde yer alamaysa da, sorguyu her zaman olduğu gibi yürütebilirsiniz. Örneğin, ayrı bir uygulama tarafından sürekli güncelleştirilen bir veritabanınız olabilir. Uygulamanıza en son verileri alan bir sorgu oluşturabilir ve her zaman farklı sonuçlar almak için bir aralıkta tekrar tekrar yürütebilirsiniz.
Hemen Yürütmeyi Zorlama
Bir dizi kaynak öğe üzerinde toplama işlevleri yapan sorguların önce bu öğeler üzerinde tekrarlamaları gerekir. Bu tür sorgulara örnek olarak Count , , ve sorguları Max Average First verilmiştir. Bunlar açık bir deyimi foreach olmadan yürütülür çünkü sorgunun kendisi bir foreach sonuç elde etmek için bunu kullandırması gerekir. Ayrıca, bu tür sorguların bir koleksiyon değil tek bir değer getir olduğunu IEnumerable unutmayın. Aşağıdaki sorgu, kaynak dizide yer alan sayıların sayısını döndürür:
var evenNumQuery =
from num in numbers
where (num % 2) == 0
select num;
int evenNumCount = evenNumQuery.Count();
Herhangi bir sorgunun hemen yürütülmesini zorlamak ve sonuçlarını önbelleğe almak için veya ToList yöntemlerini ToArray çağırabilirsiniz.
List<int> numQuery2 =
(from num in numbers
where (num % 2) == 0
select num).ToList();
// or like this:
// numQuery3 is still an int[]
var numQuery3 =
(from num in numbers
where (num % 2) == 0
select num).ToArray();
Ayrıca döngüyü sorgu ifadesinin hemen altına foreach koyarak yürütmeyi zorabilirsiniz. Ancak, veya ToList ToArray çağrısıyla tüm verileri tek bir koleksiyon nesnesinde önbelleğe de alırsiniz.