Gewusst wie: Verwenden von Lambdaausdrücken in einer Abfrage (C#-Programmierhandbuch)How to: Use Lambda Expressions in a Query (C# Programming Guide)

Sie können Lambdaausdrücke nicht direkt in der Abfragesyntax verwenden, sondern nur in Methodenaufrufen. Abfrageausdrücke können Methodenaufrufe enthalten.You do not use lambda expressions directly in query syntax, but you do use them in method calls, and query expressions can contain method calls. Einige Abfragevorgänge können nur in Methodensyntax ausgedrückt werden.In fact, some query operations can only be expressed in method syntax. Weitere Informationen zu den Unterschieden zwischen Abfragesyntax und Methodensyntax finden Sie unter Abfragesyntax und Methodensyntax in LINQ.For more information about the difference between query syntax and method syntax, see Query Syntax and Method Syntax in LINQ.

BeispielExample

Das folgende Beispiel veranschaulicht, wie Sie Lambdaausdrücke in methodenbasierten Abfragen mithilfe des Standardabfrageoperators Enumerable.Where verwenden können.The following example demonstrates how to use a lambda expression in a method-based query by using the Enumerable.Where standard query operator. Bitte beachten Sie, dass die Methode Where in diesem Beispiel einen Eingabeparameter des Delegattyps Func<TResult> aufweist und dass dieser Delegat eine Ganzzahl als Eingabe akzeptiert und einen booleschen Wert zurückgibt.Note that the Where method in this example has an input parameter of the delegate type Func<TResult> and that delegate takes an integer as input and returns a Boolean. Der Lambdaausdruck kann in diesen Delegat konvertiert werden.The lambda expression can be converted to that delegate. Wenn dies eine LINQ to SQLLINQ to SQL-Abfrage wäre, die die Methode Queryable.Where verwendet, wäre der Parametertyp Expression<Func\<int,bool>>, aber der Lambdaausdruck wäre der gleiche.If this were a LINQ to SQLLINQ to SQL query that used the Queryable.Where method, the parameter type would be an Expression<Func\<int,bool>> but the lambda expression would look exactly the same. Weitere Informationen zum Ausdruckstyp finden Sie unter System.Linq.Expressions.Expression.For more information on the Expression type, see 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            
    }
}

BeispielExample

Das folgende Beispiel veranschaulicht, wie Sie Lambdaausdrücke in einem Methodenaufruf eines Abfrageausdrucks verwenden können.The following example demonstrates how to use a lambda expression in a method call of a query expression. Der Lambdaausdruck ist erforderlich, da der Standardabfrageoperator Sum nicht durch Abfragesyntax aufgerufen werden kann.The lambda is necessary because the Sum standard query operator cannot be invoked by using query syntax.

Die Abfrage gruppiert die Studenten zunächst anhand ihres Jahrs wie in der GradeLevel-Enumeration definiert.The query first groups the students according to their grade level, as defined in the GradeLevel enum. Dann fügt sie die Gesamtergebnisse jedes Studenten in jeder Gruppe hinzu.Then for each group it adds the total scores for each student. Dazu sind zwei Sum-Operationen erforderlich.This requires two Sum operations. Mit der inneren Sum-Operation wird das Gesamtergebnis für jeden Studenten berechnet, und mit der äußeren Sum-Operation wird eine kombinierte laufende Summe für alle Studenten in der Gruppe berechnet.The inner Sum calculates the total score for each student, and the outer Sum keeps a running, combined total for all students in the group.

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
*/

Kompilieren des CodesCompiling the Code

Um diesen Code auszuführen, kopieren Sie die Methode, und fügen Sie sie in die StudentClass ein, die in Vorgehensweise: Abfragen einer Auflistung von Objekten bereitgestellt wird. Rufen Sie diese Methode dann in der Main-Methode auf.To run this code, copy and paste the method into the StudentClass that is provided in How to: Query a Collection of Objects and call it from the Main method.

Siehe auchSee Also

Lambda-AusdrückeLambda Expressions
AusdrucksbaumstrukturenExpression Trees