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

whereKlauzule je použita ve výrazu dotazu k určení, které prvky ze zdroje dat budou vráceny ve výrazu dotazu. Aplikuje logickou podmínku (predikát) na každý zdrojový element (odkazovaný proměnnou rozsahu) a vrátí hodnoty, 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.

Příklad 1

V následujícím příkladu where klauzule filtruje všechna čísla kromě těch, které jsou méně než pět. Při odebrání klauzule se where vrátí všechna čísla ze zdroje dat. Výraz num < 5 je predikát, který je použit 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

Příklad 2

V rámci jedné where klauzule můžete zadat libovolný počet predikátů podle potřeby pomocí && operátorů a || . 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

Příklad 3

whereKlauzule 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 je aktuální hodnota proměnné rozsahu 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)
    {
        return i % 2 == 0;
    }
}
//Output: 4 8 6 2 0

Poznámky

whereKlauzule je filtrovací mechanismus. Může být umístěn skoro kdekoli ve výrazu dotazu, s výjimkou nemůže být první nebo poslední klauzule. whereKlauzule může být uvedena před nebo po klauzuli skupiny v závislosti na tom, zda je nutné filtrovat zdrojové prvky před nebo po seskupení.

Pokud zadaný predikát není platný pro prvky ve zdroji dat, bude výsledkem chyba při kompilaci. Toto je jedna z výhod silné kontroly typu, kterou poskytuje LINQ.

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

Viz také