使用具有IEnumerable的Lambda表达式树

Loa*_*ian 9 c# linq tree ienumerable expression

我一直在努力学习更多关于使用Lamba表达式树的知识,因此我创建了一个简单的例子.这是代码,如果作为C#程序粘贴,这可以在LINQPad中使用.

void Main()
{
    IEnumerable<User> list = GetUsers().Where(NameContains("a"));
    list.Dump("Users");
}

// Methods
public IEnumerable<User> GetUsers()
{
    yield return new User{Name = "andrew"};
    yield return new User{Name = "rob"};
    yield return new User{Name = "chris"};
    yield return new User{Name = "ryan"};
}

public Expression<Func<User, bool>> NameContains(string namePart)
{
    return u => u.Name.Contains(namePart);
}

// Classes
public class User
{
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这会导致以下错误:

无法从用法中推断出方法'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)'的类型参数.尝试显式指定类型参数.

但是如果我用main替​​换main中的第一行:

IEnumerable<User> list = GetUsers().Where(u => u.Name.Contains("a"));
Run Code Online (Sandbox Code Playgroud)

它工作正常.可以告诉我,我做错了吗?

Tho*_*que 5

Enumerable.Where方法需要一个Func<T, bool>,而不是一个Expression<Func<T, bool>>.也许你会混淆Queryable.Where,它确实将表达式作为参数...在你的情况下,你不需要一个表达式,你只需要一个可以对序列中的每个项执行的委托.表达式的目的(大部分)被分析并转换为其他东西(例如SQL),以对外部数据源执行查询