Sdílet prostřednictvím


where – klauzule (Referenční dokumentace jazyka C#)

Klauzule where ve výrazu dotazu slouží k určení prvků ze zdroje dat, které se mají vrátit. Použije logickou podmínku (predikát) pro každý zdrojový prvek (odkazovaný proměnnou rozsahu) a vrátí prvky, pro které je zadaná podmínka pravdivá. Jeden výraz dotazu může obsahovat více where klauzulí a jedna klauzule může obsahovat více dílčích výrazů predikátu.

Referenční dokumentace jazyka C# dokumentuje naposledy vydané verze jazyka C#. Obsahuje také počáteční dokumentaci k funkcím ve verzi Public Preview pro nadcházející jazykovou verzi.

Dokumentace identifikuje všechny funkce, které byly poprvé představeny v posledních třech verzích jazyka nebo v aktuálních verzích Public Preview.

Návod

Informace o tom, kdy byla funkce poprvé představena v jazyce C#, najdete v článku o historii verzí jazyka C#.

V následujícím příkladu where klauzule vyfiltruje všechna čísla s výjimkou těch, které jsou menší než pět. Pokud klauzuli where odeberete, dotaz vrátí všechna čísla ze zdroje dat. Výraz num < 5 je predikát, který dotaz použije pro každý prvek.

class WhereSample
{
    static void Main()
    {
        // Simple data source. Arrays support IEnumerable<T>.
        int[] numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0];

        // Simple query with one predicate in where clause.
        var queryLowNums =
            from num in numbers
            where num < 5
            select num;

        // Execute the query.
        foreach (var s in queryLowNums)
        {
            Console.Write(s.ToString() + " ");
        }
    }
}
//Output: 4 1 3 2 0

V rámci jedné where klauzule můžete zadat libovolný počet predikátů pomocí & operátorů.|| V následujícím příkladu dotaz určuje dva predikáty, aby bylo možné vybrat pouze sudá čísla, která jsou menší než pět.

class WhereSample2
{
static void Main()
{
    // Data source.
    int[] numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0];

    // Create the query with two predicates in where clause.
    var queryLowNums2 =
        from num in numbers
        where num < 5 && num % 2 == 0
        select num;

    // Execute the query
    foreach (var s in queryLowNums2)
    {
        Console.Write(s.ToString() + " ");
    }
    Console.WriteLine();

    // Create the query with two where clause.
    var queryLowNums3 =
        from num in numbers
        where num < 5
        where num % 2 == 0
        select num;

    // Execute the query
    foreach (var s in queryLowNums3)
    {
        Console.Write(s.ToString() + " ");
    }
}
}
// Output:
// 4 2 0
// 4 2 0

where Klauzule může obsahovat jednu nebo více metod, které vracejí logické hodnoty. V následujícím příkladu where klauzule používá metodu k určení, zda aktuální hodnota proměnné rozsahu je sudá nebo lichá.

class WhereSample3
{
    static void Main()
    {
        // Data source
        int[] numbers = [5, 4, 1, 3, 9, 8, 6, 7, 2, 0];

        // Create the query with a method call in the where clause.
        // Note: This won't work in LINQ to SQL unless you have a
        // stored procedure that is mapped to a method by this name.
        var queryEvenNums =
            from num in numbers
            where IsEven(num)
            select num;

         // Execute the query.
        foreach (var s in queryEvenNums)
        {
            Console.Write(s.ToString() + " ");
        }
    }

    // Method may be instance method or static method.
    static bool IsEven(int i) => i % 2 == 0;
}
//Output: 4 8 6 2 0

Poznámky

Klauzule where je mechanismus filtrování. Můžete ho umístit téměř kdekoli ve výrazu dotazu, ale nemůže to být první ani poslední klauzule. where Klauzule může být zobrazena před nebo za klauzulí skupiny v závislosti na tom, jestli je potřeba filtrovat zdrojové prvky před nebo po jejich seskupení.

Pokud zadáte predikát, který není platný pro prvky ve zdroji dat, výsledkem dotazu bude chyba v době kompilace. Tato chyba je jednou z výhod silné kontroly typů, kterou poskytuje LINQ.

V době where kompilace se klíčové slovo převede na volání Where metody Standardní operátor dotazu.

Viz také