LINQ'te Sorgu Sözdizimi ve Yöntem Sözdizimi (C#)

Giriş niteliğindeki Dil Tümleşik Sorgu (LINQ) belgelerindeki sorguların çoğu LINQ bildirim temelli sorgu söz dizimi kullanılarak yazılır. Ancak, kod derlendiğinde sorgu söz diziminin .NET ortak dil çalışma zamanı (CLR) için yöntem çağrılarına çevrilmesi gerekir. Bu yöntem çağrıları, , Select, MaxGroupByJoinve Averagegibi Whereadlara sahip standart sorgu işleçlerini çağırır. Sorgu söz dizimi yerine yöntem söz dizimini kullanarak bunları doğrudan çağırabilirsiniz.

Sorgu söz dizimi ve yöntem söz dizimi diğer bir şekilde aynıdır, ancak birçok kişi sorgu söz dizimini daha basit ve daha kolay okunur bulur. Bazı sorgular yöntem çağrıları olarak ifade edilmelidir. Örneğin, belirtilen koşulla eşleşen öğelerin sayısını alan bir sorguyu ifade etmek için yöntem çağrısı kullanmanız gerekir. Ayrıca, bir kaynak dizisinde en yüksek değere sahip öğeyi alan bir sorgu için yöntem çağrısı kullanmanız gerekir. Ad alanında standart sorgu işleçleri için başvuru belgelerinde System.Linq genellikle yöntem söz dizimi kullanılır. Bu nedenle, LINQ sorguları yazmaya başlarken bile sorgularda ve sorgu ifadelerinde yöntem söz dizimini kullanmayı öğrenmek yararlıdır.

Standart Sorgu İşleci Genişletme Yöntemleri

Aşağıdaki örnekte basit bir sorgu ifadesi ve yöntem tabanlı sorgu olarak yazılmış olan eş değere eşdeğer sorgu gösterilmektedir.

class QueryVMethodSyntax
{
    static void Main()
    {
        int[] numbers = { 5, 10, 8, 3, 6, 12};

        //Query syntax:
        IEnumerable<int> numQuery1 =
            from num in numbers
            where num % 2 == 0
            orderby num
            select num;

        //Method syntax:
        IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n => n);

        foreach (int i in numQuery1)
        {
            Console.Write(i + " ");
        }
        Console.WriteLine(System.Environment.NewLine);
        foreach (int i in numQuery2)
        {
            Console.Write(i + " ");
        }

        // Keep the console open in debug mode.
        Console.WriteLine(System.Environment.NewLine);
        Console.WriteLine("Press any key to exit");
        Console.ReadKey();
    }
}
/*
    Output:
    6 8 10 12
    6 8 10 12
 */

İki örnekten alınan çıkış aynıdır. Sorgu değişkeninin türünün her iki biçimde de aynı olduğunu görebilirsiniz: IEnumerable<T>.

Yöntem tabanlı sorguyu anlamak için sorguyu daha yakından inceleyelim. İfadenin sağ tarafında yan tümcesinin where nesnesi üzerinde numbers bir örnek yöntemi olarak ifade edildiğine dikkat edin. Hatırlayacağınız gibi türündedir IEnumerable<int>. Genel IEnumerable<T> arabirimi biliyorsanız, bir Where yöntemi olmadığını biliyorsunuz. Ancak, Visual Studio IDE'de IntelliSense tamamlama listesini çağırırsanız, yalnızca bir Where yöntemi değil, aynı zamanda , SelectMany, Joinve Orderbygibi Selectdiğer birçok yöntemi görürsünüz. Bunların tümü standart sorgu işleçleridir.

Screenshot showing all the standard query operators in Intellisense.

Bu ek yöntemleri içerecek şekilde yeniden tanımlanmış gibi IEnumerable<T> görünse de, aslında durum böyle değildir. Standart sorgu işleçleri , uzantı yöntemleri olarak adlandırılan yeni bir yöntem türü olarak uygulanır. Uzantı yöntemleri mevcut bir türü "genişletir"; türünde örnek yöntemleriymiş gibi çağrılabilirler. Standart sorgu işleçleri genişler IEnumerable<T> ve bu nedenle yazabilirsiniz numbers.Where(...).

LINQ kullanmaya başlamak için uzantı yöntemleri hakkında bilmeniz gereken tek şey, doğru using yönergeleri kullanarak bunları uygulamanızda kapsama nasıl getireceğinizdir. Uygulamanızın bakış açısından bir uzantı yöntemi ve normal örnek yöntemi aynıdır.

Uzantı yöntemleri hakkında daha fazla bilgi için bkz . Uzantı Yöntemleri. Standart sorgu işleçleri hakkında daha fazla bilgi için bkz. Standart Sorgu İşleçlerine Genel Bakış (C#). LINQ to SQL ve LINQ to XML gibi bazı LINQ sağlayıcıları kendi standart sorgu işleçlerini ve dışında IEnumerable<T>diğer türler için ek uzantı yöntemlerini uygular.

Lambda İfadeleri

Önceki örnekte, koşullu ifadenin (num % 2 == 0) yöntemine Where satır içi bağımsız değişken olarak geçirildiğini göreceksiniz: Where(num => num % 2 == 0). Bu satır içi ifade lambda ifadesi olarak adlandırılır. Aksi takdirde anonim bir yöntem veya genel bir temsilci ya da ifade ağacı olarak daha hantal bir biçimde yazılması gereken kod yazmanın kullanışlı bir yoludur. C# => dilinde lambda işlecidir ve "gider" olarak okunur. num işlecinin sol tarafında, sorgu ifadesindeki öğesine num karşılık gelen giriş değişkeni yer alır. Derleyici, türünün genel IEnumerable<T> bir tür num olduğunu numbers bildiği için türünü çıkarsayabilir. Lambda gövdesi, sorgu söz dizimindeki veya başka bir C# ifadesi veya deyimindeki ifadeyle aynıdır; yöntem çağrılarını ve diğer karmaşık mantığı içerebilir. "Dönüş değeri" yalnızca ifade sonucudur.

LINQ kullanmaya başlamak için lambdaları kapsamlı bir şekilde kullanmanız gerekmez. Ancak, bazı sorgular yalnızca yöntem söz diziminde ifade edilebilir ve bazıları lambda ifadeleri gerektirir. Lambdalar hakkında daha fazla bilgi edindikten sonra, BUNLARıN LINQ araç kutunuzda güçlü ve esnek bir araç olduğunu göreceksiniz. Daha fazla bilgi için bkz. Lambda İfadeleri.

Sorgu Oluşturabilirliği

Önceki kod örneğinde yönteminin OrderBy çağrısındaki nokta işleci kullanılarak çağrıldığına Wheredikkat edin. Where filtrelenmiş bir dizi oluşturur ve ardından Orderby sıralayarak bu dizi üzerinde çalışır. Sorgular bir IEnumerabledöndüreceği için, yöntem çağrılarını birbirine zincirleyerek bunları yöntem söz diziminde oluşturursunuz. Sorgu söz dizimini kullanarak sorgu yazdığınızda derleyici arka planda bunu yapar. Sorgu değişkeni sorgunun sonuçlarını depolamadığından, sorguyu değiştirebilir veya yürütüldükten sonra bile istediğiniz zaman yeni bir sorgunun temeli olarak kullanabilirsiniz.