Предложение where (Справочник по C#)

Предложение where используется в выражении запроса для указания элементов, возвращаемых из источника данных, в выражении запроса. Это предложение применяет логическое условие (предикат) к каждому исходному элементу (со ссылкой переменной диапазона) и возвращает элементы, для которых заданное условие является истинным. В одном выражении запроса может присутствовать несколько предложений where, а в одном предложении – несколько частей выражения предиката.

Пример

В следующем примере предложение where фильтрует все числа за исключением тех, которые меньше пяти. Если предложение where удалить, из источника данных будут возвращены все числа. Выражение num < 5 является предикатом, применяемым к каждому элементу.

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

В одном предложении where можно указать столько предикатов, сколько потребуется. Для этого необходимо использовать операторы && и ||. В следующем примере в запросе указано два предиката по порядку для выбора только четных чисел, которые меньше пяти.

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 может содержаться один или несколько методов, возвращающих логические значения. В следующем примере предложение where использует метод, позволяющий определить, является ли текущее значение переменной диапазона четным или нет.

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

Заметки

Предложение where представляет собой механизм фильтрации. Это предложение можно поместить в любом месте выражения запроса, но только оно не может быть первым или последним. Предложение where может размещаться до или после предложения group, в зависимости от того, когда требуется фильтрация исходных элементов – до или после группирования.

Если указанный предикат недопустим для элементов в источнике данных, возникнет ошибка времени выполнения. Это одно преимущество строго-типизированной проверки, обеспечиваемое LINQ.

Во время выполнения ключевое слово where преобразуется в вызов метода стандартного оператора запроса Where.

См. также

Ссылки

Предложение from (справочник по C#)

Предложение "select" (справочник по C#)

Основные понятия

Фильтрация данных

Выражения запросов LINQ (Руководство по программированию на C#)

Другие ресурсы

Ключевые слова запроса (Справочник по C#)

Приступая к работе с LINQ в C#