Sdílet prostřednictvím


Syntaxe využívající dotazy a syntaxe využívající metody v jazyce LINQ (C#)

Většina dotazů úvodní dotaz integrovaný do jazyka (LINQ) dokumentace jsou zapisovány pomocí syntaxe deklarativního dotazu LINQ.Syntaxe dotazu je však přeložit do volání metody pro .NET common language runtime (CLR), v případě, že kód je zkompilován.Tato volání metody invoke standardních operátorů pro dotazování, které mají názvy jako Where, Select, GroupBy, Join, Max, a Average.Můžete jim volat přímo pomocí syntaxi metody namísto syntaxe dotazu.

Syntaxe dotazu a syntaxi metody jsou sémanticky shodné, ale mnoho lidí najít syntaxe dotazu, jednodušší a snadněji se čtou.Některé dotazy musí být vyjádřen jako volání metody.Například je nutné použít volání metody vyjádřit dotaz, který získá počet prvků, které vyhovují zadané podmínce.Také je nutné použít volání metody dotaz, který načte element, který má maximální hodnotu ve zdrojové sekvence.Referenční dokumentaci pro standardních operátorů pro dotazování v System.Linq oboru názvů obecně používá syntaxi metody.Proto i když Začínáme psaní LINQ dotazy, je užitečné znát jak použít syntaxi metody v dotazech a ve výrazech dotazu, samy o sobě.

Standardní metody rozšíření operátor dotazu

Následující příklad ukazuje jednoduchou výrazu dotazu a sémanticky rovnocenné dotazy, které jsou napsané jako dotaz založený na metodě.

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

Výstup z dvou příkladů je identické.Zobrazí typ proměnné dotazu je stejná v obou formách: IEnumerable.

Pochopit dotaz založený na metodě, podíváme se lépe.Na pravé straně výrazu, Všimněte si, where klauzule nyní vyjádřena jako metodu instance na numbers objekt, který při bude odvolání má typ IEnumerable<int>.Pokud jste obeznámeni s obecného IEnumerable rozhraní, víte, že nemá Where metoda.Však pokud vyvoláte dokončení seznamu technologie IntelliSense v integrovaném vývojovém prostředí sady Visual Studio, zobrazí se pouze Where metoda, ale mnoho metod, jako jsou Select, SelectMany, Join, a Orderby.Jedná se o všech standardních operátorů pro dotazování.

Standardní operátory dotazu v technologii Intellisense

Přestože vypadá jako IEnumerable byl předefinován zahrnout tyto další metody, ve skutečnosti tomu tak není.Standardních dotazových operátorů, které jsou implementovány jako nový druh metodu nazvanou rozšiřující metody.Rozšíření metody "rozšířit" existující typ; může být volána jako by šlo o metody instance typu.Rozšíření standardních dotazových operátorů IEnumerable a tedy proč můžete napsat numbers.Where(...).

Chcete-li začít používat LINQ, vše, co máte skutečně vědět o rozšíření metod je jak je uvedly do oboru ve vaší aplikaci pomocí správné using směrnic.To je vysvětleno dále v Postupy: Vytvoření projektu LINQ.Z hlediska aplikace rozšiřující metodu a normální instanci metody jsou stejné.

Další informace o metodách rozšíření, viz Metody rozšíření (Průvodce programováním v C#).Další informace o standardních dotazových operátorů, viz Přehled standardních operátorů dotazu.Některé LINQ poskytovatelů, jako je například Technologie LINQ to SQL a Technologie LINQ to XML, implementovat vlastní standardních operátorů pro dotazování a dalších rozšiřujících metod pro jiné typy kromě IEnumerable.

Lambda výrazy

V předchozím příkladu, Všimněte si, podmíněný výraz (num % 2 == 0) je předán jako argument v řádku Where metoda: Where(num => num % 2 == 0). tomto vloženém výrazu se nazývá lambda výraz.Je pohodlný způsob, jak napsat kód, který by v opačném případě musí být napsány v podobě více komplikací jako anonymní metody nebo obecný delegát nebo strom výrazů.V jazyce C# => je lambda operátor, který bude čtena jako "dosáhne".num Na levé straně operátoru se vstupní proměnnou, která odpovídá num ve výrazu dotazu.Kompilátor může odvodit typ num protože ví, že numbers je obecný IEnumerable typu.Text lambda je stejně jako výraz v syntaxi dotazu nebo v jakémkoli jiném jazyce C# výraz prohlášení; může zahrnovat jiné komplexní logiky a volání metod."Vrácená hodnota" je pouze výsledek vyjádření.

Chcete-li začít používat LINQ, není nutné použít lambda výrazy rozsáhlé.Ale některé dotazy lze vyjádřit pouze v syntaxi metody a některé z těch, které vyžadují lambda výrazy.Poté, co se seznámíte s lambda výrazy, zjistíte, že jsou výkonné a flexibilní nástroj v své LINQ nástrojů.Další informace naleznete v tématu Výrazy Lambda (Průvodce programováním v C#).

Composability dotazy

V předchozím příkladu kódu, Všimněte si, OrderBy pomocí operátoru tečka na volání je volána metoda Where.Wherevytváří filtrované sekvence a potom Orderby pracuje v uvedeném pořadí podle řazení je.Protože dotazy vracet IEnumerable, je psaní v syntaxi metody pomocí volání metody zřetězení společně.Je to, co kompilátor nemá na pozadí při psaní dotazů pomocí syntaxe dotazu.A protože proměnnou dotazovacího neukládá výsledky dotazu, můžete jej upravit nebo použít jako základ pro nový dotaz kdykoli, dokonce i poté, co byl proveden.

Viz také

Další zdroje

Začínáme s dotazy LINQ v jazyce C#