方法: クエリでラムダ式を使用する (C# プログラミング ガイド)How to: Use Lambda Expressions in a Query (C# Programming Guide)

クエリ構文でラムダ式を直接使うことはありませんが、メソッドの呼び出しで使い、クエリ式はメソッドの呼び出しを含むことができます。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. 実際、一部のクエリ操作はメソッド構文でのみ表現できます。In fact, some query operations can only be expressed in method syntax. クエリ構文とメソッド構文の違いについて詳しくは、「LINQ でのクエリ構文とメソッド構文」をご覧ください。For more information about the difference between query syntax and method syntax, see Query Syntax and Method Syntax in LINQ.

Example

次の例を見ると、Enumerable.Where 標準クエリ演算子を使用することにより、メソッド ベースのクエリでラムダ式を使用する方法がわかります。The following example demonstrates how to use a lambda expression in a method-based query by using the Enumerable.Where standard query operator. この例の Where メソッドにはデリゲート型 Func<T,TResult> の入力パラメーターがあり、そのデリゲートは入力として整数を受け取ってブール値を返すことに注意してください。Note that the Where method in this example has an input parameter of the delegate type Func<T,TResult> and that delegate takes an integer as input and returns a Boolean. ラムダ式は、そのデリゲートに変換できます。The lambda expression can be converted to that delegate. これが Queryable.Where メソッドを使用する LINQ to SQLLINQ to SQL のクエリであったなら、パラメーターの型は Expression<Func<int,bool>> になりますが、ラムダ式の表現はまったく同じです。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. 式の型の詳細については、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            
    }
}

Example

次の例では、クエリ式のメソッド呼び出しでラムダ式を使う方法を示します。The following example demonstrates how to use a lambda expression in a method call of a query expression. Sum 標準クエリ演算子はクエリ構文を使って呼び出すことができないため、ラムダが必要です。The lambda is necessary because the Sum standard query operator cannot be invoked by using query syntax.

このクエリは最初に、GradeLevel 列挙型で定義されている成績レベルに従って、学生をグループ分けします。The query first groups the students according to their grade level, as defined in the GradeLevel enum. その後、各グループについて、各学生の合計点数を追加します。Then for each group it adds the total scores for each student. これには、2 つの Sum 演算が必要です。This requires two Sum operations. 内側の Sum は各学生の合計点数を計算し、外側の Sum はグループ内のすべての学生の集計中の合計を保持します。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
*/

コードのコンパイルCompiling the Code

このコードを実行するには、メソッドをコピーして StudentClass (これは「方法: オブジェクトのコレクションを照会する」で提供されています) に貼り付けた後、Main メソッドからそれを呼び出します。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.

関連項目See also