English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Le espressioni lambda possono essere assegnate a delegati di tipo Func o Action per gestire insiemi in memoria. Il compilatore .NET trasforma le espressioni lambda assegnate a delegati di tipo Func o Action in codice eseguibile durante la compilazione.
LINQ ha introdotto un nuovo tipo chiamato Expression, che rappresenta un'espressione lambda di tipo强类型. Questo significa che un'espressione lambda può anche essere assegnata a un tipo Expression <TDelegate>. Il compilatore .NET trasforma le espressioni lambda assegnate a Expression <TDelegate> in un albero espressione, piuttosto che in codice eseguibile. I provider di query LINQ remoto utilizzano questo albero espressione come struttura dati per costruire query runtime (ad esempio LINQ-to-SQL, EntityFramework o qualsiasi altro provider di query LINQ che implementi l'interfaccia IQueryable <T>).
La seguente figura spiega la differenza tra assegnare un'espressione lambda a un delegato di tipo Func o Action e utilizzare Expression in LINQ.
Nel prossimo capitolo, impareremo a conoscere gli alberi espressione, ma prima di tutto, vediamo come definire e chiamare un'espressione.
CitazioneSystem.Linq.ExpressionsNello spazio dei nomi, utilizza la classe Expression <TDelegate> per definire un'Expression. Expression <TDelegate> richiede il tipo di delegato Func o Action.
Ad esempio, puoi assegnare un'espressione lambda al variabile del tipo di delegato Func isTeenAger, come segue:
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;Esempio: definire espressioni in VB.Net per il delegato Func
Dim isTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20
Ora, puoi avvolgere il delegato Func con Expresson, convertendo il tipo di delegato Func in Expression, come segue:
Esempio: definire espressioni in C# Expresson
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;
Esempio: definire espressioni in VB.Net
Dim isTeenAgerExpr As Expression(Func(Of Student, Boolean)) = Function(s) s.Age > 12 And s.Age < 20
Nello stesso modo, se non restitui un valore dal delegato, puoi anche avvolgere il tipo di delegato Action <t> con Expression.
Esempio: definire espressioni in C#
Expression<Action<Student>> printStudentName = s => Console.WriteLine(s.StudentName);
Esempio: definire espressioni in VB.Net
Dim printStudentName As Expression(Action(Of Student) = Function(s) Console.WriteLine(s.StudentName);
Pertanto, puoi definire il tipo di Expression <TDelegate>. Ora, vediamo come chiamare il delegato avvolto da 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方法将其作为委托调用的compile表达式 Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile() Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20 })
在下一节中,将详细了解表达式树。