Clausola where (Riferimento C#)

La clausola where viene utilizzata in un'espressione di query per specificare gli elementi dell'origine dati che verranno restituiti nell'espressione di query. Applica una condizione booleana (predicato) a ogni elemento di origine, a cui fa riferimento la variabile di intervallo, e restituisce quelli 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

Nell'esempio seguente la clausola where esclude tutti i numeri tranne quelli che sono minori di cinque. Se si rimuove la clausola where, vengono restituiti tutti i numeri dell'origine dati. L'espressione num < 5 è il predicato 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

All'interno di una singola clausola where è possibile specificare tutti i predicati necessari utilizzando 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() + " ");
        }            
    }
}
// Output: 4 2 0

La clausola where può contenere uno o più metodi che restituiscono valori booleani. Nell'esempio seguente la clausola where utilizza 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)
    {
        return i % 2 == 0;
    }    
}
//Output: 4 8 6 2 0

Note

La clausola where rappresenta un meccanismo di filtro. Può essere posizionata quasi ovunque in un'espressione di query, ma non può essere la prima o l'ultima clausola. La clausola where può essere posizionata prima o dopo una clausola group a seconda che gli elementi di origine debbano essere filtrati prima o dopo essere stati raggruppati.

Se un predicato specificato non è valido per gli elementi dell'origine dati, verrà generato un errore in fase di compilazione. Si tratta di un vantaggio del rigido controllo dei tipi fornito da LINQ.

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

Vedere anche

Riferimenti

Clausola from (Riferimento C#)

Clausola select (Riferimento C#)

Concetti

Filtraggio dei dati

Espressioni di query LINQ (Guida per programmatori C#)

Altre risorse

Parole chiave di query (Riferimenti per C#)

Nozioni di base su LINQ in C#