LINQ 表達式(Expression)

可以將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ū)別。

ExpressionTree流程
Expression 和 Func

在下一節(jié)中,我們將學(xué)習(xí)表達式樹,但首先,讓我們看看如何定義和調(diào)用表達式。

定義 Expression

引用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)

您可以用與委托相同的方式調(diào)用由Expression包裹的委托,但是首先需要使用Compile()方法進行編譯。Compile()返回FuncAction類型的委托,以便您可以像委托一樣調(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é)中將詳細了解表達式樹。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清