可以將lambda表達式分配給Func或Action類型委托,以處理內(nèi)存中的集合。.NET編譯器在編譯時將分配給Func或Action類型委托的lambda表達式轉(zhuǎn)換為可執(zhí)行代碼。
LINQ引入了一種名為Expression的新類型,該類型代表強類型的lambda表達式。這意味著lambda表達式也可以分配給Expression <TDelegate>類型。.NET編譯器將分配給Expression <TDelegate>的lambda表達式轉(zhuǎn)換為Expression樹,而不是可執(zhí)行代碼。遠程LINQ查詢提供程序使用此表達式樹作為數(shù)據(jù)結(jié)構(gòu),以其構(gòu)建運行時查詢(例如LINQ-to-SQL,EntityFramework或?qū)崿F(xiàn)IQueryable <T>接口的任何其他LINQ查詢提供程序)。
下圖說明了將lambda表達式分配給Func或Action委托與LINQ中的Expression時的區(qū)別。
在下一節(jié)中,我們將學(xué)習(xí)表達式樹,但首先,讓我們看看如何定義和調(diào)用表達式。
引用System.Linq.Expressions命名空間,并使用Expression <TDelegate>類定義一個Expression。Expression <TDelegate>需要委托類型Func或Action。
例如,你可以將 lambda 表達式賦給 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;示例:在VB.Net中為表達式定義Func委托
Dim isTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20
現(xiàn)在,您可以使用Expresson包裝Func委托,將上述Func類型委托轉(zhuǎn)換為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) = Function(s) Console.WriteLine(s.StudentName);
因此,您可以定義Expression <TDelegate>類型?,F(xiàn)在,讓我們看看如何調(diào)用由Expression <TDelegate>包裝的委托。
您可以用與委托相同的方式調(diào)用由Expression包裹的委托,但是首先需要使用Compile()方法進行編譯。Compile()返回Func或Action類型的委托,以便您可以像委托一樣調(diào)用它。
示例:在C#中調(diào)用表達式
Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20; //使用Compile方法編譯Expression以將其作為委托調(diào)用 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方法將其作為委托調(diào)用的compile表達式 Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile() Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20})
在下一節(jié)中將詳細了解表達式樹。