Udostępnij za pośrednictwem


Klauzula where (odwołanie w C#)

Klauzula where jest używana w wyrażeniu zapytania, aby określić, które elementy ze źródła danych zostaną zwrócone w wyrażeniu zapytania. Stosuje warunek logiczny (predykat) do każdego elementu źródłowego (odwołuje się do zmiennej zakresu) i zwraca te, dla których określony warunek ma wartość true. Jedno wyrażenie zapytania może zawierać wiele where klauzul, a pojedyncza klauzula może zawierać wiele podwyrażeń podrzędnych predykatu.

Przykład 1

W poniższym przykładzie klauzula where filtruje wszystkie liczby z wyjątkiem tych, które są mniejsze niż pięć. Jeśli usuniesz klauzulę where , zostaną zwrócone wszystkie liczby ze źródła danych. Wyrażenie num < 5 jest predykatem, który jest stosowany do każdego elementu.

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

Przykład 2

W ramach jednej where klauzuli można określić dowolną liczbę predykatów w razie potrzeby przy użyciu operatorów &&i||. W poniższym przykładzie zapytanie określa dwa predykaty, aby wybrać tylko liczby parzyse, które są mniejsze niż pięć.

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

Przykład 3

Klauzula where może zawierać co najmniej jedną metodę zwracającą wartości logiczne. W poniższym przykładzie klauzula where używa metody w celu określenia, czy bieżąca wartość zmiennej zakresu jest parzysta, czy nieparzysta.

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

Uwagi

Klauzula where jest mechanizmem filtrowania. Można go umieścić niemal w dowolnym miejscu w wyrażeniu zapytania, z wyjątkiem tego, że nie może być pierwszą ani ostatnią klauzulą. Klauzula where może pojawić się przed lub po klauzuli grupy w zależności od tego, czy należy filtrować elementy źródłowe przed grupą lub po ich zgrupowaniu.

Jeśli określony predykat nie jest prawidłowy dla elementów w źródle danych, zostanie wyświetlony błąd czasu kompilacji. Jest to jedna z zalet silnego sprawdzania typów zapewnianego przez LINQ.

W czasie where kompilacji słowo kluczowe jest konwertowane na wywołanie Where metody Standard Query Operator.

Zobacz też