Поделиться через


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

where Используйте предложение в выражении запроса, чтобы указать, какие элементы из источника данных следует возвращать. Он применяет логическое условие (предикат) к каждому исходному элементу (на который ссылается переменная диапазона) и возвращает те элементы, для которых указанное условие имеет значение true. Одно выражение запроса может содержать несколько where предложений, а одно предложение может содержать несколько вложенных выражений предиката.

Справочные документы по языку C# описывают последнюю выпущенную версию языка C#. Она также содержит начальную документацию по функциям в общедоступных предварительных версиях для предстоящего языкового выпуска.

Документация определяет любую функцию, впервые представленную в последних трех версиях языка или в текущих общедоступных предварительных версиях.

Подсказка

Чтобы узнать, когда функция впервые появилась в C#, ознакомьтесь со статьей об истории версий языка C#.

В следующем примере предложение фильтрует все числа, 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) => i % 2 == 0;
}
//Output: 4 8 6 2 0

Замечания

Предложение where — это механизм фильтрации. Его можно разместить практически в любом месте выражения запроса, за исключением того, что оно не может быть первым или последним предложением. Предложение where может отображаться до или после предложения группы в зависимости от того, нужно ли фильтровать исходные элементы до или после их группировки.

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

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

См. также