5

我有两种非常相似的方法:

public IQueryable<User> Find(Func<User, bool> exp)
{
    return db.Users.Where(exp);
}

public IQueryable<User> All()
{
    return db.Users.Where(x => !x.deleted);
}

最上面的,不会编译,说它返回 IEnumerable 而不是 IQueryable。

为什么是这样?

另外,我知道我可以在最后添加“AsQueryable()”,它会起作用。但这有什么区别?有什么性能命中吗?我了解 IQueryable 已延迟执行等,我还能获得此好处吗?

4

1 回答 1

17

Enumerable.Where需要Func<T, bool>.

Queryable.Where需要Expression<Func<T, bool>>.

您正在使用 调用 Where Func<T, bool>,因此只有Enumerable.Where调用适用,并且返回IEnumerable<T>

将您的方法更改为:

public IQueryable<User> Find(Expression<Func<User, bool>> exp)
{
    return db.Users.Where(exp);
}

应该没问题。基本上,您希望传入表达式树而不是委托,以便将表达式转换为 SQL。

于 2009-08-21T10:19:18.920 回答