Clausola where (Riferimento C#)

La clausola where viene usata in un'espressione di query per specificare quali elementi dell'origine dati verranno restituiti nell'espressione di query. Viene applicata una condizione booleana (predicato) a ogni elemento di origine (a cui fa riferimento la variabile di intervallo) e viene restituita quella per cui la condizione specificata è vera. Una singola espressione di query può contenere più clausole where e una singola clausola può contenere più sottoespressioni di predicato.

Esempio 1

Nell'esempio seguente la clausola where esclude tutti i numeri tranne quelli minori di cinque. Se si rimuove la clausola where, vengono restituiti tutti i numeri dell'origine dati. L'espressione num < 5 è il predicato che viene applicato a ogni elemento.

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

Esempio 2

All'interno di una singola clausola where è possibile specificare tanti predicati quanti sono necessari usando gli operatori && e ||. Nell'esempio seguente la query specifica due predicati per selezionare solo i numeri pari minori di cinque.

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

Esempio 3

Una clausola where può contenere uno o più metodi che restituiscono valori booleani. Nell'esempio seguente la clausola where usa un metodo per determinare se il valore corrente della variabile di intervallo è pari o dispari.

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

Osservazioni:

La clausola where è un meccanismo di filtro. Può essere posizionata praticamente ovunque in un'espressione di query, ma non può essere la prima o l'ultima clausola. Una clausola where la può apparire prima o dopo una clausola group a seconda se gli elementi di origine devono essere filtrati prima o dopo essere stati raggruppati.

Se un predicato specificato non è valido per gli elementi nell'origine dati, si verificherà un errore in fase di compilazione. Questo è un vantaggio del controllo dei tipi sicuro fornito da LINQ.

In fase di compilazione, la parola chiave where viene convertita in una chiamata al metodo Where dell'operatore query standard.

Vedi anche