Aracılığıyla paylaş


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

Sorguların çoğu tanıtım dil ile tümleşik sorgu (LINQ) belgelerine LINQ tanımlayıcı sorgu sözdizimi kullanılarak yazılır.Kod derlenir, ancak sorgu sözdizimini .NET ortak dil çalışma zamanı (clr) yöntem çağrılarında içine çevrilmesi gerekir.Bu yöntem çağrılarını çağırmak gibi adlara sahip standart sorgu işleçler Where, Select, GroupBy, Join, Max, ve Average.Bunları doğrudan sorgu sözdizimi yerine yöntemi sözdizimini kullanarak çağırabilirsiniz.

Sorgu sözdizimi ve yöntemi sözdiziminin anlam olarak aynıdır, ancak birçok kişi daha basit ve kolay okunur sorgu sözdizimi bulmak.Bazı sorgular yöntem çağrıları ifade edilebilir.Örneğin, sorguda belirtilen bir koşula uyan öğelerin sayısını alır ifade etmek için bir yöntem çağrısı kullanmanız gerekir.Bir kaynak dizideki en büyük değer olan öğe alan bir sorgu için bir yöntem çağrısı da kullanmanız gerekir.Standart sorgu işleçler, başvuru belgelerine System.Linq ad alanı genellikle yöntemi sözdizimini kullanır.Bu nedenle, bile yazma Başlarken LINQ sorguları, onu, sorgular ve sorgu ifadeleri kendilerini yöntemi sözdizimini kullanma hakkında bilgi sahibi olmanız yararlıdır.

Standart sorgu işleci genişletme yöntemleri

Aşağıdaki örnek, basit bir gösterir sorgu ifadesi ve anlam olarak eşdeğer sorgu olarak yazılmış bir yöntemi tabanlı sorgu.

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 örnek çıktısı aynıdır.Sorgu değişkeni türü paralar aynı olduğunu görebilirsiniz: IEnumerable<T>.

Yöntemi tabanlı sorgu anlamak için onu daha yakından inceleyelim.Sağ tarafındaki ifade dikkat where yan tümcesi şimdi ifade bir örnek yöntemi numbers geri çağırma, siz nesnesi vardır ve bir tür IEnumerable<int>.İle genel hakkında bilginiz varsa IEnumerable<T> arabirimi, bildiğiniz sahip olmadığı, bir Where yöntem.Ancak, Visual Studio IDE IntelliSense Tamamlanma listesinde çağırmak, göreceğiniz yalnızca bir Where yöntemi, ancak gibi birçok yöntem Select, SelectMany, Join, ve Orderby.Standart sorgu işleçler şunlardır.

IntelliSense'de standart sorgu işleçleri

Görünüyor olsa da sanki IEnumerable<T> bu durum böyle değil aslında bu ek yöntemleri içerecek şekilde yeniden tanımlandı.Yöntem adı verilen yeni bir tür olarak standart sorgu işleçleri uygulanmadığı uzatma yöntemleri.Uzantıları yöntemleri "Genişlet" Varolan bir türü; Bu türün örnek yöntemleri sanki bunlar çağrılabilir.Standart sorgu işleçler genişletmek IEnumerable<T> ve diğer bir deyişle yazma neden numbers.Where(...).

Kullanmaya başlamak için LINQ, gerçekten uzantı yöntemleri hakkında bilmeniz gereken tüm, bunları uygulamanızdaki kapsam içine doğru kullanarak nasıl using yönergeleri.Bu, ayrıca açıklanan Nasıl yapılır: bir LINQ projesi oluşturma.Uygulamanızın bakış açısından, bir uzantı yöntemini ve normal örnek yöntemi aynıdır.

Uzantı yöntemleri hakkında daha fazla bilgi için bkz: Uzantı yöntemleri (C# Programlama Kılavuzu).Standart sorgu işleçler hakkında daha fazla bilgi için bkz: Standart sorgu işleçler genel bakış.Bazı LINQ sağlayıcıları gibi LINQ to SQL ve LINQ to XML, kendi standart sorgu işleçler ve yanı sıra diğer türleri için ek genişletme yöntemleri uygulayan IEnumerable<T>.

Lambda İfadeleri

Önceki örnekte dikkat koşullu deyim (num % 2 == 0) satır içi bağımsız değişken olarak geçirilen Where yöntemi: Where(num => num % 2 == 0). bu satır içi ifade lambda ifadesi olarak adlandırılır.Aksi takdirde daha hantal formunda Adsýz bir yöntem veya genel bir temsilci ya da bir ifade ağacı yazılması gerekir kod yazmak için bir yoldur.C# [NULL]'ta => "duruma geçer" olarak okumak lambda işleç ile aynıdır.num Karşılık gelen giriş değişkeni işlecinin sol tarafta ise num sorgu ifadesinde.Derleyici tür çıkarımını num , bildiği için numbers genel IEnumerable<T> türü.Tıpkı sorgu sözdizimi veya diğer herhangi bir C# ifade ve deyimin deyim lambda gövdesi olur; yöntem çağrıları ve diğer karmaşık mantığı ekleyebilirsiniz."Dönüş" ifade sonucu değerdir.

Kullanmaya başlamak için LINQ, lambda kapsamlı bir şekilde kullanmak zorunda kalmazsınız.Ancak, bazı sorgular yalnızca yöntem sözdiziminde ifade edilebilir ve olanlar bazıları lambda ifadeleri gerektirir.Lambda ile daha tanıdık sonra güçlü ve esnek bir araç olduğunu bulacaksınız, LINQ araç.Daha fazla bilgi için bkz. Lambda ifadeleri (C# Programlama Kılavuzu).

Sorgu composability

Önceki kod örneğinde, dikkat edin OrderBy çağrısında nokta operatörünü kullanarak yöntemi çağrıldığında Where.WhereFiltre uygulanmış bir sıra oluşturur ve sonra Orderby o sıralamasına göre sıralama çalışır.Sorguları döndürür çünkü bir IEnumerable, size bunları yöntemi sözdiziminde yöntem çağrıları birbirine bağlayarak oluştur.Sorgu sözdizimini kullanarak sorgu yazdığınızda derleyici arka planda yaptığı budur.Ve bir sorgu değişkeni sorgu sonuçlarını depolamadığından, değiştiremez veya hatta yürütüldükten sonra herhangi bir anda, yeni bir sorgu için temel olarak kullanmak.

Ayrıca bkz.

Diğer Kaynaklar

C# [NULL]'taki LINQ ile çalışmaya başlama