Udostępnij za pośrednictwem


Składnia zapytania i metody w technologii LINQ (C#)

Większość kwerend w wprowadzające Language Integrated Query (LINQ) dokumentacji są zapisywane przy użyciu składni LINQ deklaracyjne kwerendy.Jednak składnia kwerendy należy przetłumaczyć na wywołania metody dla platformy .NET common language runtime (CLR), gdy kompilowany jest kod.Te wywołania metody wywoływania operatorów standardowej kwerendy, które mają nazwy takie jak Where, Select, GroupBy, Join, Max, i Average.Możesz zadzwonić do nich bezpośrednio, używając składni metody zamiast składni kwerendy.

Składnia kwerendy i składnia metody są semantycznie identyczne, ale wiele osób znaleźć składni kwerendy, prostsze i bardziej czytelny.Niektóre kwerendy musi być wyrażona jako wywołania metody.Na przykład należy użyć wywołania metody do wyrażenia kwerendy, która pobiera liczbę elementów spełniających określony warunek.Również należy użyć wywołanie metody dla kwerendy, która pobiera element, który ma maksymalną wartość w sekwencji źródłowej.Dokumentacja referencyjna dla kierowników standardowej kwerendy w System.Linq obszaru nazw używany jest składnia metody.W związku z tym, nawet wówczas, gdy wprowadzenie piśmie LINQ kwerendy, warto zapoznać się z jak używać składni metody, w kwerendach i wyrażenia kwerendy, same.

Standardowe metody rozszerzenie Operator kwerendy

W poniższym przykładzie przedstawiono prosty wyrażenie kwerendy i semantycznie równoważne kwerendy jako kwerend opartych na metodzie.

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
 */

Dane wyjściowe z dwa przykłady są identyczne.Widać, że typ zmiennej kwerendy jest taka sama w obu formach: IEnumerable<T>.

Aby zrozumieć kwerend opartych na metodzie, Zbadajmy to ściślej.Po prawej stronie wyrażenia, należy zauważyć, że where klauzuli teraz wyraża się jako metodę instancji na numbers obiekt, który, jak będzie przypominać ma typ IEnumerable<int>.Jeśli znasz nazwę rodzajową IEnumerable<T> interfejsu, wiadomo że nie ma Where metoda.Jednakże, gdy możesz wywołać listy opcji IntelliSense zakończenia w programie Visual Studio IDE, widoczne są nie tylko Where metody, ale wielu innych metod, takich jak Select, SelectMany, Join, i Orderby.Są to wszystkie operatory standardowej kwerendy.

Standardowe operatory zapytań w technologii Intellisense

Mimo że wygląda tak, jakby IEnumerable<T> został zdefiniowany ponownie, aby uwzględnić te dodatkowe metody, w rzeczywistości nie jest tak.Operatory standardowej kwerendy są implementowane jako nowy rodzaj metodę o nazwie rozszerzenie metody.Metody rozszerzenia "rozszerzyć" istniejącego typu; może być wywoływana tak, jakby były metody instancji w typie.Operatory standardowej kwerendy rozszerzyć IEnumerable<T> i oznacza to dlaczego możesz zapisywać numbers.Where(...).

Aby korzystać z LINQ, wszystko, co naprawdę trzeba wiedzieć o rozszerzenie metody jest jak dostosowania ich do zakresu w aplikacji przy użyciu prawidłowego using dyrektyw.Dodatkowo w tłumaczy Jak: Tworzenie projektu LINQ.Z punktu widzenia aplikacji metodę rozszerzenia i metody instancji regularnych są takie same.

Aby dowiedzieć się więcej na temat metod rozszerzenie, zobacz Rozszerzenie metody (Podręcznik programowania C#).Aby uzyskać więcej informacji na temat operatorów standardowej kwerendy, zobacz Omówienie operatory kwerendy standardowe.Niektóre LINQ dostawców, takich jak LINQ to SQL i LINQ to XML, implementować swoje własne kwerendy standardowe operatory i metody dodatkowe rozszerzenie dla innych typów poza IEnumerable<T>.

Wyrażenia lambda

W poprzednim przykładzie, należy zauważyć, że wyrażenie warunkowe (num % 2 == 0) jest przekazywana jako argument w wierszu Where metody: Where(num => num % 2 == 0). to wyrażenie inline nosi nazwę wyrażenia lambda.Jest to wygodny sposób napisanie kodu, który w przeciwnym razie należy zapisać w postaci bardziej uciążliwe jako metody anonimowej lub Delegat rodzajowy lub drzewa wyrażenie.W języku C# => jest operator lambda, który ma być odczytywany jako "zbliża się do".num Po lewej stronie operatora jest zmienną wejściową, która odpowiada num w wyrażeniu kwerendy.Kompilator można wywnioskować, typ num ponieważ wie, że numbers jest ogólnym IEnumerable<T> typu.Treść lambda jest tak samo jak wyrażenie w składni kwerendy lub w C# wyrażenie lub instrukcja; może zawierać wywołań metod i innych logik złożonych."Wartość zwracana" jest tylko wynik wyrażenia.

Aby korzystać z LINQ, nie trzeba używać lambdas obszernie.Jednak niektóre kwerendy mogą być tylko wyrażone w składni metody i niektóre z nich wymagają wyrażenia lambda.Po lepszym zapoznaniu z lambdas, znajdziesz, że są potężnym i elastycznym narzędziem w swojej LINQ przybornika.Aby uzyskać więcej informacji, zobacz Wyrażenia lambda (Podręcznik programowania C#).

Możliwości tworzenia struktury kwerend

W poprzednim przykładzie, należy zauważyć, że OrderBy za pomocą operatora kropki na wywołanie wywoływana jest metoda Where.WhereTworzy filtrowane sekwencji, a następnie Orderby działa w tej sekwencji sortowanie.Ponieważ kwerendy zwracają IEnumerable, je redagować w składni metody przez tworzenie łańcucha wywołań metod razem.Jest to, co kompilator nie w tle podczas programowania kwerendy przy użyciu składni kwerendy.A ponieważ zmiennej zapytania nie przechowuje wyników kwerendy, można go zmodyfikować lub użyć go jako podstawy dla nowej kwerendy w dowolnym momencie, nawet po zostało uruchomione.

Zobacz też

Inne zasoby

Wprowadzenie do programu LINQ w C#