C#Lambda既可以作为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)

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

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