在LINQ to Objects中,扩展方法需要将一个委托类型作为参数,这样就可以将lambda表达式赋予参数。lambda表达式也可以赋予Expression类型的参数。C#编译器根据类型给lambda表达式定义不同的行为。如果类型是Expression,编译器就从lambda表达式中创建一个表达式树,并存储在程序集中。这样,就可以在运行期间分析表达式树,并进行优化,以便于查询数据源。
下面看看一个前面使用的查询表达式(代码文件ExpressionTreeSample/Program.cs);
var brazilRacers = from r in racers
where r.Country == “Brazil”
orderby r.Wins
select r;
这个查询表达式使用了扩展方法Where()、OrderByO和Select()。 Enumerable类定义了Where)扩展方法,并将委托类型Func<T,bool>作为参数谓词。
public static IEnumerable Where{
this IEnumerable source, Func<TSource, bool> predicate);
这样,就把lambda表达式赋予谓词。这里lambda表达式类似于前面介绍的匿名方法。
Func<Racer, bool> predicate =r => r.Country == “Brazil”;
Enumerable类不是唯—一个定义了扩展方法Where()的类。Queryable类也定义了WhereO扩展方法。这个类对Where(扩展方法的定义是不同的:
public static IQueryable Where
(this IQueryable source,
Expression<Func<TSource, bool>> predicate):
其中,把lambda表达式赋予类型Expression,该类型的操
C#表达树
于 2022-07-21 09:38:11 首次发布
本文探讨了C#中的Lambda表达式如何在LINQ to Objects中转换为表达式树,用于在运行时分析和优化查询。通过示例展示了查询表达式的编译过程,以及如何通过Enumerable和Queryable的扩展方法Where(),分别处理Func委托和Expression委托,解释了Expression类及其子类在构建和解析表达式树中的作用。
摘要由CSDN通过智能技术生成