猿教程 Logo

Linq中的表达式

我们已经知道,lambda表达式可以分配给Func或Action类型的委托,以便在内存中的集合中进行处理。 .NET编译器将分配给Func或Action类型委托的lambda表达式转换为编译时的可执行代码。

LINQ引入了称为Expression的新类型,表示强类型的lambda表达式。 这意味着lambda表达式也可以分配给Expression<TDelegate>类型。 .NET编译器将分配给Expression<TDelegate>的lambda表达式转换为表达式树而不是可执行代码。 这个表达式树被远程LINQ查询提供者用作构建运行时查询的数据结构(例如LINQ-to-SQL,EntityFramework或任何其他实现IQueryable <T>接口的LINQ查询提供程序)。

下图说明了分配给Func或Action委托的lambda表达式和LINQ中的Expression的差异。


我们将在下一节学习表达式树,但首先,让我们看看如何定义和调用表达式。


定义表达式:

添加System.Linq.Expressions命名空间的引用,并使用Expression <TDelegate>类来定义表达式。 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相关实例:

Dim isTeenAger As Func(Of Student, Boolean) = Function(s) s.Age > 12 And s.Age < 20

现在,你可以通过使用Expresson包装Func委托将上述Func类型委托转换为一个Expression,如下所示:

相关实例:

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>类型委托。

相关实例:

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>类型。 现在,让我们看看如何调用由Expression <TDelegate>包装的委托。


调用表达式:

你可以像委托一样调用由表达式包装的委托,但首先你需要使用Compile()方法来编译它。 Compile()返回delegateof Func或Action类型,以便您可以像委托调用它。

相关实例:

Expression<Func<Student, bool>> isTeenAgerExpr = s => s.age > 12 && s.age < 20;

//compile Expression using Compile method to invoke it as Delegate
Func<Student, bool>  isTeenAger = isTeenAgerExpr.Compile();
            
//Invoke
bool result = isTeenAger(new Student(){ StudentID = 1, StudentName = "Steve", Age = 20});

VB.NET相关实例:

Dim isTeenAgerExpr As Expression(Of Func(Of Student, Boolean)) = 
                                                    Function(s) s.Age > 12 And s.Age < 20

'compile Expression using Compile method to invoke it as Delegate
Dim isTeenAger As Func(Of Student, Boolean) = isTeenAgerExpr.Compile()

Dim result = isTeenAger(New Student() With { .StudentID = 1, .StudentName = "Steve", .Age = 20})

猿教程(www.yuanjiaocheng.net)下一节中详细了解表达式树。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/Linq/linq-expression.html