【问题标题】:Why is my LINQ statement returning IEnumerable?为什么我的 LINQ 语句返回 IEnumerable?
【发布时间】:2026-01-29 20:45:01
【问题描述】:

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

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 已延迟执行等,我还能获得此好处吗?

【问题讨论】:

    标签: c# linq-to-sql iqueryable


    【解决方案1】:

    Enumerable.Where 接受Func&lt;T, bool&gt;

    Queryable.Where 接受Expression&lt;Func&lt;T, bool&gt;&gt;

    您正在使用 Func&lt;T, bool&gt; 调用 Where,因此只有 Enumerable.Where 调用适用,并且返回 IEnumerable&lt;T&gt;

    将您的方法更改为:

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

    应该没问题。基本上你想传入一个表达式树而不是一个委托,以便表达式可以转换为 SQL。

    【讨论】:

      最近更新 更多