English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Lambda expressions can be assigned to Func or Action type delegates to handle in-memory collections. The .NET compiler converts lambda expressions assigned to Func or Action type delegates into executable code at compile time.
LINQ introduces a new type called Expression, which represents strongly typed lambda expressions. This means that lambda expressions can also be assigned to the Expression <TDelegate> type. The .NET compiler converts lambda expressions assigned to Expression <TDelegate> into expression trees, not executable code. Remote LINQ query providers use this expression tree as a data structure to build runtime queries (such as LINQ-to-SQL, EntityFramework, or any other LINQ query provider that implements the IQueryable <T> interface).
The following figure illustrates the difference between assigning a lambda expression to a Func or Action delegate and an Expression in LINQ.
In the next section, we will learn about expression trees, but first, let's see how to define and call expressions.
referenceSystem.Linq.ExpressionsПространство имен, и определите Expression <TDelegate> классом Expression. Expression <TDelegate> требует типа делегата Func или Action.
Например, вы можете присвоить lambda-выражение переменной delегата типа Func, такой как isTeenAger, как показано ниже:
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;Пример: определение делегата Func для выражения в VB.Net
Dim isTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20
Теперь вы можете использовать Expression для упаковки делегата Func, чтобы преобразовать тип делегата Func в Expression, как показано ниже:
Пример: определение выражения в C# Expresson
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;
Пример: определение выражения в VB.Net
Dim isTeenAgerExpr As Expression(Func(Of Student, Boolean)) = Function(s) s.Age > 12 And s.Age < 20
Таким же образом, если вы не возвращаете значение из делегата, вы также можете использовать Expression для упаковки типа делегата Action <t>.
Пример: определение выражения в C#
Expression<Action<Student>> printStudentName = s => Console.WriteLine(s.StudentName);
Пример: определение выражения в VB.Net
Dim printStudentName As Expression(Action(Of Student) = Функция (s) Console.WriteLine(s.StudentName);
Таким образом, вы можете определить тип Expression <TDelegate>. Давайте посмотрим, как вызвать делегат, 包装ленный 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 для компиляции выражения в делегат для вызова' Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile() Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20 })
В следующем разделе будет подробно рассмотрено дерево выражений.