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

LINQ-Ausdruck (Expression)

Lambda-Ausdrücke können an Delegaten von Typen Func oder Action zugewiesen werden, um Sammlungen im Speicher zu verarbeiten. Der .NET-Compiler konvertiert Lambda-Ausdrücke, die an Delegaten von Typen Func oder Action zugewiesen werden, bei der Kompilierung in ausführbaren Code.

LINQ führt eine neue Typenart namens Expression ein, die starke Lambda-Ausdrücke darstellt. Dies bedeutet, dass Lambda-Ausdrücke auch an den Typen Delegate von Expression <TDelegate> zugewiesen werden können. Der .NET-Compiler konvertiert Lambda-Ausdrücke, die an Expression <TDelegate> zugewiesen werden, in Expression-Bäume, anstatt in ausführbaren Code. Remote LINQ-Abfrageanbieter verwenden diesen Expression-Baum als Datenstruktur, um Runtime-Abfragen zu bauen (z.B. LINQ-zu-SQL, EntityFramework oder jeder andere LINQ-Abfrageanbieter, der das Interface IQueryable <T> implementiert).

Das folgende Diagramm zeigt die Unterschiede zwischen der Zuweisung von Lambda-Ausdrücken an Delegaten von Func oder Action und Expression in LINQ.

Expression und Func

Im nächsten Abschnitt werden wir Expression-Bäume lernen, aber zunächst sollten wir schauen, wie man Definitionen und Aufrufe von Ausdrücken definiert und aufgerufen werden.

Definition von Expression

BibliothekSystem.Linq.ExpressionsNamensraum und verwenden Sie die Klasse Expression <TDelegate> zur Definition einer Expression. Expression <TDelegate> erfordert den Delegiertentyp Func oder Action.

Zum Beispiel können Sie einen Lambda-Ausdruck einer Variable vom Typ Func-Typen-Delegierten wie isTeenAger zuweisen, wie folgt:

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;
Beispiel: Definition von Func-Delegierten für Ausdrücke in VB.Net
Dim isTeenAger As Func<Student, Boolean> = Function(s) s.Age > 12 Und s.Age < 20

Jetzt können Sie den Delegierten Func mit Expression verpacken und die oben genannten Typen von Func-Delegierten in Expression umwandeln, wie folgt:

 Beispiel: Definition von Ausdrücken in C# Expresson

Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;

Beispiel: Definition von Ausdrücken in VB.Net

Dim isTeenAgerExpr As Expression<Func<Student, Boolean>> = 
                                        Function(s) s.Age > 12 Und s.Age < 20

Auf dieselbe Weise können Sie auch den Typ Action <t> von Delegierten mit Expression verpacken, wenn Sie keine Werte vom Delegierten zurückgeben.

Beispiel: Definition von Ausdrücken in C#

Expression<Action<Student>> printStudentName = s => Console.WriteLine(s.StudentName);

Beispiel: Definition von Ausdrücken in VB.Net

Dim printStudentName As Expression<Action<Student> = 
                                        Funktion(s) Console.WriteLine(s.StudentName);

Daher können Sie den Typ Expression <TDelegate> definieren. Lassen Sie uns nun sehen, wie man den Delegierten, der von Expression <TDelegate> verpackt wird, aufruft.

Aufruf des Ausdrucks (Expression)

Sie können den Delegat, der von Expression umschlossen ist, auf die gleiche Weise wie einen Delegat aufrufen, aber Sie müssen zuerst die Methode Compile() verwenden, um ihn zu kompilieren. Compile() gibt zurückFuncoderActionTypen von Delegaten, damit Sie es wie einen Delegat aufrufen können.

    Beispiel: Ausdruck in C# aufrufen

Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;
//Verwenden Sie die Methode Compile, um Expression als Delegat abzurufen zu kompilieren
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 Und s.Age < 20
'Verwenden Sie die Methode compile, um sie als Delegat abzurufen zu compilieren
Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile()
Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20)

In dem nächsten Abschnitt werden Ausdrucksbäume im Detail vorgestellt.