在LINQ to Objects中,扩展方法需要将一个委托类型作为参数,这样就可以将lambda表达式赋予参数。lambda表达式也可以赋予Expression<T>类型的参数。C#编译器根据类型给lambda表达式定义不同的行为。如果类型是Expression<T>,编辑器就从lambda表达式中创建一个表达式树,并存储在程序集中。这样,就可以在运行期间分析表达式树,并进行优化,以便于查询数据源。
下面看看前面使用的一个查询表达式:
var brazilRacers = from r in racers
where r.Country == "Brazil"
orderby r.Wins
select r;
这个查询表达式使用了扩展方法Where()、OrderBy()和Select()。Enumerable类定义了Where()扩展方法,并将委托类型Func<T,bool>作为参数谓词。
public static IEnumerable<TSource> Where<TSource>(
this IEnumerable<TSource> sources,Func<TSource,bool> predicate
);
这样,就把lambda表达式赋予谓词。这里lambda表达式类似于前面介绍的匿名方法。