English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Se puede asignar una expresión lambda a un delegado de tipo Func o Action para procesar conjuntos en memoria. El compilador de .NET convierte las expresiones lambda asignadas a tipos de delegado Func o Action en código ejecutable.
LINQ introduce un nuevo tipo llamado Expression, que representa expresiones lambda de tipo fuerte. Esto significa que las expresiones lambda también se pueden asignar a tipos de delegado Expression <TDelegate>. El compilador de .NET convierte las expresiones lambda asignadas a Expression <TDelegate> en árboles de expresiones, en lugar de código ejecutable. Los proveedores de consultas LINQ remotos utilizan este árbol de expresiones como estructura de datos para construir consultas en tiempo de ejecución (por ejemplo, LINQ)-a-SQL, EntityFramework o cualquier otro proveedor de consultas LINQ que implemente la interfaz IQueryable <T> (por ejemplo).
La siguiente imagen ilustra la diferencia entre asignar una expresión lambda a un delegado de tipo Func o Action y una expresión en LINQ.
En la siguiente sección, aprenderemos sobre árboles de expresiones, pero primero, veamos cómo definir y llamar a las expresiones.
ReferenciaSystem.Linq.ExpressionsEspacio de nombres, y defina una Expression utilizando la clase Expression <TDelegate>. Expression <TDelegate> necesita el tipo de delegado Func o Action.
Por ejemplo, puede asignar una expresión lambda al variable de tipo delegado Func isTeenAger de la siguiente manera:
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;Ejemplo: Definir delegado Func para expresiones en VB.Net
Dim isTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20
Ahora, puede usar Expression para encapsular el delegado Func, convirtiendo el tipo de delegado Func en Expression de la siguiente manera:
Ejemplo: Definir expresiones en C# Expresson
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;
Ejemplo: Definir expresiones en VB.Net
Dim isTeenAgerExpr As Expression(Func(Of Student, Boolean)) = Function(s) s.Age > 12 And s.Age < 20
De la misma manera, si no devuelve un valor desde el delegado, también se puede usar Expression para encapsular el tipo de delegado Action <t>.
Ejemplo: Definir expresiones en C#
Expression<Action<Student>> printStudentName = s => Console.WriteLine(s.StudentName);
Ejemplo: Definir expresiones en VB.Net
Dim printStudentName As Expression(Action(Of Student) = Function(s) Console.WriteLine(s.StudentName);
Por lo tanto, puede definir el tipo Expression <TDelegate>. Ahora, veamos cómo llamar al delegado encapsulado por Expression <TDelegate>.
Puede llamar al delegado envuelto por Expression de la misma manera que a un delegado, pero primero debe usar el método Compile(). Compile() devuelveFuncOAcciónDelegado para que pueda llamarlo de la misma manera que un delegado.
Ejemplo: Llamar a la expresión en C#
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20; //Usar el método Compile para compilar Expression como llamada de delegado 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 'Usar el método compile para compilarlo como expresión de delegado' Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile() Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20)
En la siguiente sección se explicará en detalle el árbol de expresiones.