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

表达式(Expression)LINQ

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.

Expression e Func

Nel prossimo capitolo, impareremo a conoscere gli alberi espressione, ma prima di tutto, vediamo come definire e chiamare un'espressione.

Definizione di Expression

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>.

Chiamata espressione(Expression)

您可以用与委托相同的方式调用由Expression包裹的委托,但是首先需要使用Compile()方法进行编译。Compile()返回FuncAction类型的委托,以便您可以像委托一样调用它。

    示例:在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 })

在下一节中,将详细了解表达式树。