Lambdas 可以作为 Func 和 Expression 发出

假设以下 Person 类:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

以下 lambda:

p => p.Age > 18

可以作为参数传递给两个方法:

public void AsFunc(Func<Person, bool> func)
public void AsExpression(Expression<Func<Person, bool>> expr)

因为编译器能够将 lambdas 转换为委托和 Expressions。

显然,LINQ 提供商严重依赖 Expressions(主要通过 IQueryable<T> 接口公开),以便能够解析查询并将其转换为存储查询。