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

Предложение where используется в выражении запроса для того, чтобы указать, какие элементы из источника данных будут возвращаться в выражении запроса.The where clause is used in a query expression to specify which elements from the data source will be returned in the query expression. Оно применяет логическое условие (предикат) к каждому исходному элементу (на который ссылается переменная диапазона) и возвращает те из них, для которых указанное условие имеет значение true.It applies a Boolean condition (predicate) to each source element (referenced by the range variable) and returns those for which the specified condition is true. Одно выражение запроса может содержать сразу несколько предложений where, а одно предложение — несколько частей выражения предиката.A single query expression may contain multiple where clauses and a single clause may contain multiple predicate subexpressions.

ПримерExample

В следующем примере предложение where отфильтровывает все номера, кроме тех, которые меньше пяти.In the following example, the where clause filters out all numbers except those that are less than five. Если удалить предложение where, возвращаются все номера из источника данных.If you remove the where clause, all numbers from the data source would be returned. Выражение num < 5 является предикатом, который применяется к каждому элементу.The expression num < 5 is the predicate that is applied to each element.

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

ПримерExample

В одном предложении where можно указать необходимое число предикатов, используя операторы && и ||.Within a single where clause, you can specify as many predicates as necessary by using the && and || operators. В следующем примере запрос определяет два предиката, позволяющие отобрать только четные номера меньше пяти.In the following example, the query specifies two predicates in order to select only the even numbers that are less than five.

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

ПримерExample

Предложение where может содержать один или несколько методов, возвращающих логические значения.A where clause may contain one or more methods that return Boolean values. В следующем примере предложение where использует метод для того, чтобы определить, является ли текущее значение диапазона четным или нечетным.In the following example, the where clause uses a method to determine whether the current value of the range variable is even or odd.

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

ПримечанияRemarks

Предложение where представляет собой механизм фильтрации.The where clause is a filtering mechanism. Он может располагаться практически в любом месте выражения запроса, но не может быть первым или последним предложением.It can be positioned almost anywhere in a query expression, except it cannot be the first or last clause. Предложение where может отображаться до или после предложения group в зависимости от того, необходимо ли отфильтровать исходные элементы до или после их объединения в группы.A where clause may appear either before or after a group clause depending on whether you have to filter the source elements before or after they are grouped.

Если указанный предикат недопустим для элементов в источнике данных, это вызовет ошибку компиляции.If a specified predicate is not valid for the elements in the data source, a compile-time error will result. Это одно из преимуществ надежной проверки типов, предоставляемой LINQLINQ.This is one benefit of the strong type-checking provided by LINQLINQ.

Во время компиляции ключевое слово where преобразуется в вызов метода стандартного оператора запроса Where.At compile time the where keyword is converted into a call to the Where Standard Query Operator method.

См. такжеSee Also