English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
lambda表現をFuncまたはActionデリゲートに割り当てることができます。これにより、メモリ内の集合を処理できます。.NETコンパイラは、コンパイル時にFuncまたはActionデリゲートに割り当てられたlambda表現を実行可能なコードに変換します。
LINQは、強い型のlambda表現を表す新しいタイプであるExpressionを導入しました。これは、lambda表現がExpression <TDelegate>タイプに割り当てられることも意味します。.NETコンパイラは、Expression <TDelegate>に割り当てられたlambda表現をExpressionツリーに変換し、実行可能なコードに変換しません。リモートLINQクエリプロバイダは、このExpressionツリーを使用してデータ構造として構築し、ランタイムクエリ(例えばLINQ-to-SQL、EntityFramework、またはIQueryable <T>インターフェースを実装する他のLINQクエリプロバイダ()。
以下の図は、lambda表現をFuncまたはActionデリゲートに割り当て、LINQのExpressionに割り当てる場合の違いを示しています。
次の節では、表現木について学びますが、まずは表現の定義と呼び出し方を見てみましょう。
参照System.Linq.Expressions名前空間を使用して、Expression <TDelegate>クラスを定義し、Expression <TDelegate>はFuncまたはActionのデリゲート类型が必要です。
例えば、lambda表現をFunc型のデリゲートのisTeenAger変数に割り当てることができます:
public class Student { public int StudentID { get; set; } public string StudentName { get; set; } public int Age { get; set; } } Func<Student, bool> isTeenAger = s => s.Age > 12 && s.Age < 20;例:VB.NetでFuncデリゲートを表現に定義
Dim isTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20
今では、FuncデリゲートをExpressionで包装して、以下のようにFunc型のデリゲートをExpressionに変換することができます:
例:C#で表現を定義 Expresson
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;
例:VB.Netで表現を定義
Dim isTeenAgerExpr As Expression<Func(Of Student, Boolean)> = Function(s) s.Age > 12 And s.Age < 20
同じ方法で、デリゲートから値を返さない場合、Action <t>型のデリゲートをExpressionで包装することもできます。
例:C#で表現を定義
Expression<Action<Student>> printStudentName = s => Console.WriteLine(s.StudentName);
例:VB.Netで表現を定義
Dim printStudentName As Expression<Action(Of Student)> = Function(s) Console.WriteLine(s.StudentName);
したがって、Expression <TDelegate>型を定義できます。今からExpression <TDelegate>で包装されたデリゲートの呼び出し方法を見てみましょう。
Expressionでデリゲートを包装したものをデリゲートのように呼び出すことができますが、まずCompile()メソッドを使用してコンパイルする必要があります。Compile()は、FuncまたはActionの型のデリゲートを提供して、デリゲートのように呼び出すことができます。
例:C#で表現を呼び出す
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20; //Compileメソッドを使用してExpressionをコンパイルしてデリゲート呼び出しとして使用します Func<Student, bool> isTeenAger = isTeenAgerExpr.Compile(); //Invoke bool result = isTeenAger(new Student(){ StudentID = 1, StudentName = "Steve", Age = 20});
Dim isTeenAgerExpr As Expression(Of Func(Of Student, Boolean)) = Function(s) s.Age > 12 And s.Age < 20 'compileメソッドを使用してデリゲート呼び出しとしてコンパイルします Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile() Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20)
次のセクションでは、表現木について詳しく説明します。