Aracılığıyla paylaş


LINQ Sorgularına Giriş (C#)

Sorgu veri kaynağından verileri alan bir ifadedir.Sorgular genellikle bir özel sorgu dilinde ifade edilir.Farklı diller zamanla çeşitli veri kaynağı türleri için geliştirilir, örneğin ilişkisel veritabanları için SQL ve XML için XQuery gibi.Bu nedenle, geliştiriciler desteklemeleri gereken her veri kaynağı türü veya veri biçimi için yeni bir sorgu dili öğrenmek zorunda kalmışlardır.LINQ bu durumu, çeşitli veri kaynakları ve biçimler arasında veri ile çalışma için tutarlı bir model sunarak basitleştirir.Bir LINQ sorgusunda, her zaman nesnelerle çalışırsınız.XML belgelerinde, SQL veritabanlarında, ADO.NET Veri Kümelerinde, .NET koleksiyonlarında ve bir LINQ sağlayıcısının bulunduğu diğer biçimlerden birindeki verileri sorgulamak ve dönüştürmek için bazı temel kodlama desenlerini kullanırsınız.

Bir Sorgu İşleminin Üç Bölümü

Tüm LINQ sorgu işlemleri üç farlı eylemden oluşur:

  1. Veri kaynağını edinin.

  2. Sorgu oluşturun.

  3. Sorguyu yürütün.

Aşağıdaki örnek, bir sorgu işleminin üç bölümünün kaynak kodunda nasıl ifade edildiğini gösterir.Örnekte, kolay olması için, veri kaynağı olarak bir tamsayı dizisi kullanılmaktadır; ancak aynı kavramlar diğer veri kaynakları için de geçerlidir.Bu konunun geri kalanında bu örneğe başvurulmaktadır.

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 resimde, tam bir sorgu işlemi gösterilmektedir.LINQ içinde sorgunun yürütülmesi sorgunun kendisinden farklıdır, diğer bir deyişle, tüm verileri bir sorgu değişkeni oluşturarak almış olmazsınız.

LINQ Sorgu işlemini tamamlama

Veri Kaynağı

Önceki örnekte veri kaynağı bir dizi olduğundan genel IEnumerable arabirimini örtülü olarak destekler.Bu gerçek, LINQ ile sorgulanabileceği anlamına gelir.Sorgu, foreach deyiminde yürütülür ve foreach, IEnumerable veya IEnumerable gerektirir.IEnumerable destekleyen türler veya genel IQueryable gibi türetilmiş bir arabirim sorgulanabilir türler olarak da bilinir.

Sorgulanabilir tür, LINQ veri kaynağı olarak çalışması için herhangi bir değişiklik veya özel bir işlem yapılması gerektirmez.Kaynak verisi zaten bellekte bir sorgulanabilir tür olarak yoksa, LINQ sağlayıcı bunu bu şekilde sunmalıdır.Örneğin LINQ - XML, bir XML belgesini sorgulanabilir bir XElement türüne yükler:

// Create a data source from an XML document. 
// using System.Xml.Linq;
XElement contacts = XElement.Load(@"c:\myContactList.xml");

LINQ - SQL ile, önce tasarım zamanında el ile veya Object Relational Designer (O/R Designer) kullanarak nesneyle ilişkili bir eşleme oluşturursunuz.Nesneler için sorgularınızı yazarsınız ve çalışma zamanında LINQ - SQL veritabanı ile iletişimi yönetir.Aşağıdaki örnekte, Customers veritabanındaki belirli bir tabloyu ve IEnumerable öğesinden alınan sorgu sonuç türünü IQueryable temsil eder.

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 tür veri kaynakları 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: bir LINQ veri kaynağı yalnızca genel IEnumerable arayüzünü ya da bundan devralan bir arayüzü destekler.

[!NOT]

Genel olmayan IEnumerable arabirimini destekleyen ArrayList gibi türler LINQ veri kaynağı olarak da kullanılabilir.Daha fazla bilgi için bkz. Nasıl yapılır: LINQ ile ArrayList Sorgulama.

Sorgu

Sorgu, veri kaynağından veya kaynaklarından hangi bilgilerin alınacağını belirtir.İsteğe bağlı olarak, bir sorgu döndürülmeden önce bu bilgilerin nasıl sıralanmış, gruplandırılmış ve şekillendirilmiş olması gerektiğini de belirtir.Bir sorgu, sorgu değişkeninde depolanır ve sorgu ifadesiyle başlatılır.Sorguları yazmayı kolaylaştırmak için, C# yeni sorgu sözdizimi tanıttı.

Önceki örnekteki sorgu, tamsayı dizisinden tüm çift sayıları döndürür.Üç sorgu ifadesi üç yan tümce içeriyor: from, where ve select. (SQL'e alışıksanız, tümcelerin sırasının SQL'deki sıranın tam tersi şekilde olduğunu fark etmişsinizdir.) from yan tümcesi veri kaynağını belirtir, where yan tümcesi filtreyi uygular, select yan tümcesi ise döndürülen öğelerin türünü belirtir.Bunlar ve diğer sorgu yan tümceleri LINQ Sorgu İfadeleri (C# Programlama Kılavuzu) bölümünde ayrıntılı olarak ele alınmıştır.Şimdilik önemli nokta LINQ içinde sorgu değişkeninin kendisinin hiç eylem almaması ve veri döndürmemesidir.Sadece bir sonraki noktada sorgu çalıştırıldığında sonuçları üretmek için gerekli olan bilgileri depolar.Sorguların sahne arkasında nasıl oluşturulduğu hakkında daha fazla bilgi için bkz Standart Sorgu İşleçlerine Genel Bakış.

[!NOT]

Sorgular ayrıca yöntem sözdizimini kullanarak ifade edilebilir.Daha fazla bilgi için bkz. LINQ'te Sorgu Sözdizimi ve Yöntem Sözdizimi (C#).

Sorgu Yürütme

Ertelenmiş Yürütme

Daha önce bahsedildiği gibi sorgu değişkeni sorgu komutlarını depolar.Sorgunun gerçek yürütmesi, üzerinden yineleme kadar ertelenmiştir bir foreach ifadesi içindeki sorgu değişkeni üzerinde yineleme yapılana kadar ertelenir.Bu kavram, ertelenmiş yürütme olarak adlandırılır ve aşağıdaki örnekte gösterilmiştir:

//  Query execution.  
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

foreach deyimi aynı zamanda sorgu sonuçlarının alındığı yerdir.Örneğin önceki sorguda yineleme değeri num her değeri (bir kerede bir tane) döndürülen sırada tutar.

Sorgu değişkeninin kendisi asla sorgu sonuçlarını tutmadığından bunu istediğiniz sıklıkta yürütebilirsiniz.Örneğin, ayrı bir uygulama tarafından sürekli olarak güncelleştirilen bir veritabanınız olabilir.Uygulamanızdaki en son verileri alan bir sorgu oluşturabilir ve her seferinde farklı sonuçlar almak için bazı aralıklarla sürekli olarak yürütebilirsiniz.

Hemen Yürütmeyi Zorlama

Çeşitli kaynak öğeler üzerinde toplama işlevleri gerçekleştiren sorgular önce bu öğeler üzerinde yinelenmelidir.Bu gibi sorguların örnekleri: Count, Max, Average ve First.Bunlar açık bir foreach deyimi olmadan yürütülür çünkü sorgunun kendisi bir sonuç döndürmek için foreach kullanmalıdır.Ayrıca sorguların bu türlerinin tek bir değer döndürdüğüne, bir IEnumerable koleksiyonu döndürmediğine dikkat edin.Aşağıdaki sorgu, kaynak dizideki çift 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 kaydetmek için, ToList``1 veya ToArray``1 yöntemlerini ç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();

sorgu ifadesinin hemen arkasına foreach döngüsünü koyarak da yürütmeyi zorlayabilirsiniz.Ancak, ToList veya ToArray çağırarak ayrıca tüm veriyi tek koleksiyon nesnesindeki önbelleğe alırsınız.

Ayrıca bkz.

Görevler

İzlenecek yol: C#'de Sorgu Yazma (LINQ)

LINQ Örnekleri

Başvuru

foreach, in (C# Başvurusu)

Kavramlar

O/R Designer Overview

LINQ Sorgu İfadeleri (C# Programlama Kılavuzu)

Diğer Kaynaklar

C#'de LINQ'e Başlarken

Sorgu Anahtar Sözcükleri (C# Başvurusu)

LINQ ve Ertelenmiş Yürütme Videosu