English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
As expressões lambda podem ser atribuídas a tipos de delegates Func ou Action para manipular conjuntos em memória. O compilador .NET converte expressões lambda atribuídas a tipos de delegates Func ou Action em código executável.
O LINQ introduziu um novo tipo chamado Expression, que representa expressões lambda tipadas fortemente. Isso significa que expressões lambda também podem ser atribuídas ao tipo Expression <TDelegate>. O compilador .NET converte expressões lambda atribuídas a Expression <TDelegate> em árvores de expressão, em vez de código executável. Provedores de consulta LINQ remotos usam essa árvore de expressão como estrutura de dados para construir consultas de tempo de execução (por exemplo, LINQ-to-SQL, EntityFramework ou qualquer outro provedor de consulta LINQ que implemente a interface IQueryable <T> (por exemplo).
A figura a seguir ilustra a diferença entre atribuir uma expressão lambda a um delegate Func ou Action e a Expression no LINQ.
No próximo capítulo, vamos aprender sobre árvores de expressão, mas antes disso, vamos ver como definir e chamar expressões.
ReferênciaSystem.Linq.ExpressionsEspaço de nomes, e defina uma Expression usando a classe Expression <TDelegate>. Expression <TDelegate> precisa do tipo de delegado Func ou Action.
Por exemplo, você pode atribuir uma expressão lambda ao delegate do tipo Func para a variável isTeenAger, conforme mostrado a seguir:
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 E s.Age < 20;Exemplo: Definindo Func delegado para expressão no VB.Net
Dim isTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 20
Agora, você pode usar Expression para encapsular o delegado Func, convertendo o tipo de delegado Func para Expression, conforme mostrado a seguir:
Exemplo: Definindo expressões no C# Expresson
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 E s.Age < 20;
Exemplo: Definindo expressões no VB.Net
Dim isTeenAgerExpr As Expression<Func(Of Student, Boolean)> = Function(s) s.Age > 12 20
Da mesma forma, se você não retornar um valor do delegado, você ainda pode usar Expression para encapsular o tipo de delegado Action <t>.
Exemplo: Definindo expressões no C#
Expression<Action<Student>> printStudentName = s => Console.WriteLine(s.StudentName);
Exemplo: Definindo expressões no VB.Net
Dim printStudentName As Expression<Action(Of Student) > Function(s) Console.WriteLine(s.StudentName);
Portanto, você pode definir o tipo Expression <TDelegate>. Agora, vamos ver como chamar o delegado encapsulado por Expression <TDelegate>.
Você pode chamar o delegate encapsulado por Expression da mesma forma que um delegate, mas primeiro precisa usar o método Compile(). Compile() retornaFuncOuActionDo tipo de delegate, para que você possa chamá-lo da mesma forma que um delegate.
Exemplo: Chamar expressão no C#
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 E s.Age < 20; //Usar o método Compile para compilar Expression para chamada de delegate 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 20 'Usar o método compile para torná-lo uma expressão de chamada de delegate', Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile() Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20)
No próximo capítulo, detalharemos a árvore de expressão.