Procedura: utilizzare espressioni lambda in una query (Guida per programmatori C#)

Le espressioni lambda non vengono utilizzate direttamente nella sintassi della query ma vengono utilizzate nelle chiamate al metodo e le espressioni di query possono contenere le chiamate al metodo. Alcune operazioni di query possono infatti essere espresse solo nella sintassi del metodo. Per ulteriori informazioni sulla differenza tra la sintassi della query e la sintassi del metodo, vedere Confronto tra sintassi di query LINQ e sintassi dei metodi (C#).

Esempio

Nell'esempio seguente viene illustrato come utilizzare un'espressione lambda in una query basata sul metodo utilizzando l'operatore di query standard Enumerable.Where. Tenere presente che il metodo Where in questo esempio contiene un parametro di input del tipo di delegato Func<TResult> e che il delegato accetta un intero come input e restituisce un valore booleano. L'espressione lambda può essere convertita in tale delegato. Se si utilizza una query LINQ to SQL con il metodo Queryable.Where, il tipo di parametro è Expression<Func<int,bool>> mentre l'espressione lambda è esattamente la stessa. Per ulteriori informazioni sul tipo di espressione, vedere System.Linq.Expressions.Expression.

class SimpleLambda
{
    static void Main()
    {

        // Data source.
        int[] scores = { 90, 71, 82, 93, 75, 82 };

        // The call to Count forces iteration of the source
        int highScoreCount = scores.Where(n => n > 80).Count();

        Console.WriteLine("{0} scores are greater than 80", highScoreCount);

        // Outputs: 4 scores are greater than 80            
    }
}

Nell'esempio seguente viene illustrato come utilizzare un'espressione lambda in una chiamata al metodo di un'espressione di query. L'espressione lambda è necessaria poiché l'operatore di query standard Sum() non può essere richiamato utilizzando la sintassi della query.

La query prima raggruppa gli studenti in base all'anno scolastico, come definito nell'enumerazione GradeLevel. Quindi per ciascun gruppo aggiunge il punteggio totale di ogni studente. A tale scopo sono necessarie due operazioni Sum. L'operazione Sum interna calcola il punteggio totale di ogni studente mentre l'operazione Sum esterna gestisce un totale parziale complessivo di tutti gli studenti del gruppo.

private static void TotalsByGradeLevel()
{
    // This query retrieves the total scores for First Year students, Second Years, and so on.
    // The outer Sum method uses a lambda in order to specify which numbers to add together.
    var categories =
    from student in students
    group student by student.Year into studentGroup
    select new { GradeLevel = studentGroup.Key, TotalScore = studentGroup.Sum(s => s.ExamScores.Sum()) };

    // Execute the query.   
    foreach (var cat in categories)
    {
        Console.WriteLine("Key = {0} Sum = {1}", cat.GradeLevel, cat.TotalScore);
    }
}
/*
     Outputs: 
     Key = SecondYear Sum = 1014
     Key = ThirdYear Sum = 964
     Key = FirstYear Sum = 1058
     Key = FourthYear Sum = 974
*/

Compilazione del codice

Per eseguire questo codice, copiare e incollare il metodo nella classe StudentClass fornita in Procedura: eseguire una query su un insieme di oggetti (Guida per programmatori C#) e chiamarla dal metodo Main.

Vedere anche

Riferimenti

Espressioni lambda (Guida per programmatori C#)

Concetti

Strutture ad albero dell'espressione (C# e Visual Basic)