English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

LINQ 表現(Expression)

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に割り当てる場合の違いを示しています。

Expression と Func

次の節では、表現木について学びますが、まずは表現の定義と呼び出し方を見てみましょう。

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)を呼び出す

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)

次のセクションでは、表現木について詳しく説明します。