English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Les expressions lambda peuvent être attribuées aux types de délégués Func ou Action pour traiter des collections en mémoire. Le compilateur .NET convertit les expressions lambda attribuées aux types de délégués Func ou Action en code exécutable lors de la compilation.
LINQ introduit un nouveau type appelé Expression, qui représente des expressions lambda de type fort. Cela signifie que les expressions lambda peuvent également être attribuées au type Expression <TDelegate>. Le compilateur .NET convertit les expressions lambda attribuées à Expression <TDelegate> en arbres d'expressions, plutôt que en code exécutable. Les fournisseurs de requêtes LINQ distantes utilisent cet arbre d'expression comme structure de données pour construire les requêtes au moment de l'exécution (par exemple, LINQ-to-SQL, EntityFramework ou tout autre fournisseur de requêtes LINQ implémentant l'interface IQueryable <T> (par exemple).
La figure suivante montre la différence entre attribuer une expression lambda à un délégué Func ou Action et une Expression dans LINQ.
Dans la section suivante, nous allons étudier les arbres d'expressions, mais d'abord, regardons comment définir et appeler une expression.
RéférenceSystem.Linq.ExpressionsEspace de noms, et définissez une Expression en utilisant la classe Expression <TDelegate>. Expression <TDelegate> nécessite le type de délégué Func ou Action.
Par exemple, vous pouvez attribuer une expression lambda au délégué de type Func pour la variable isTeenAger, comme suit :
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 Et s.Age < 20;Exemple : Définir un délégué Func pour l'expression en VB.Net
Dim isTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 Et s.Age < 20
Maintenant, vous pouvez envelopper le délégué Func avec Expression pour convertir le délégué de type Func en Expression, comme suit :
Exemple : Définir une expression en C# Expresson
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 Et s.Age < 20;
Exemple : Définir une expression en VB.Net
Dim isTeenAgerExpr As Expression(Func(Of Student, Boolean)) = Function(s) s.Age > 12 Et s.Age < 20
De la même manière, si vous ne retournez pas de valeur depuis le délégué, vous pouvez également envelopper le type de délégué Action <t> avec Expression.
Exemple : Définir une expression en C#
Expression<Action<Student>> printStudentName = s => Console.WriteLine(s.StudentName);
Exemple : Définir une expression en VB.Net
Dim printStudentName As Expression(Action(Of Student) = Function(s) Console.WriteLine(s.StudentName);
Par conséquent, vous pouvez définir le type Expression <TDelegate>. Maintenant, regardons comment appeler le délégué enveloppé par Expression <TDelegate>.
Vous pouvez appeler le délégué enveloppé par Expression de la même manière que le délégué, mais vous devez d'abord utiliser la méthode Compile(). Compile() retourneFuncOuActionTypes de délégués, afin que vous puissiez les appeler comme un délégué.
Exemple : Appel de l'expression en C#
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 Et s.Age < 20; //Compilez l'Expression en utilisant la méthode Compile pour la convertir en appel de délégation 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 Et s.Age < 20 'Utilisez la méthode compile pour la convertir en expression de délégation Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile() Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20)
Dans la prochaine section, vous découvrirez en détail l'arbre d'expression.