如何获取 IQueryable扩展方法而不是 IEnumerable扩展?

发布于 2024-12-02 09:29:58 字数 1309 浏览 2 评论 0 原文

可能非常简单,所以请原谅我的无知...

据我所知,Where() 扩展方法有几种风格:

Queryable.Where;方法(IQueryable、表达式>)

Enumerable.Where; Method (IEnumerable, Func)

以上两个扩展都位于 System.Linq 命名空间中,这样我就可以do Where() 希望足以证明我已经导入了正确的命名空间 - 或者 IQueryable 扩展是否需要另一个命名空间?

我明白 IQueryable 继承自 IEnumerable但为什么我无法获得 IQueryable 扩展?

class Test
{
    IQueryable<Test> SomeMethod(Func<T, bool> criteria)
    {
        return new List<Test> { new Test() }.AsQueryable().Where(criteria); // compiler error converting IEnumerable<T> to IQueryable<T>
    }

}

如上所示,应该有一个返回 IQueryable 的可用扩展方法吗?为什么它解析为 IEnumerable 扩展?

Probably really simple so please excuse my ignorance...

To my knowledge, there are a couple flavours of the Where() extension method:

Queryable.Where<TSource> Method (IQueryable<TSource>, Expression<Func<TSource, Boolean>>)

Enumerable.Where<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)

Both of the above extensions are housed in the System.Linq namespace, so that I can do Where() at all is hopefully proof enough that I've imported the correct namespace - or is there another namespace I need for IQueryable extensions?

I understand that IQueryable<T> inherits from IEnumerable<T> but why can't I get the IQueryable<T> extensions?

class Test
{
    IQueryable<Test> SomeMethod(Func<T, bool> criteria)
    {
        return new List<Test> { new Test() }.AsQueryable().Where(criteria); // compiler error converting IEnumerable<T> to IQueryable<T>
    }

}

As shown above, there should be an extension method available that returns IQueryable? Why is it resolving to the IEnumerable Extensions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一紙繁鸢 2024-12-09 09:29:58

Queryable.Where 扩展方法 需要一个 Expression> ;(即表示 lambda 的表达式树),而不是 Func(lambda 本身)。

这有效:

IQueryable<Test> ApplyCriteria(IQueryable<Test> queryable,
                               Expression<Func<Test, bool>> criteria)
{   //                              ↑
    return queryable.Where(criteria);
}

The Queryable.Where Extension Method expects an Expression<Func<T, bool>> (i.e. an expression tree representing a lambda), not a Func<T, bool> (a lambda itself).

This works:

IQueryable<Test> ApplyCriteria(IQueryable<Test> queryable,
                               Expression<Func<Test, bool>> criteria)
{   //                              ↑
    return queryable.Where(criteria);
}
狼亦尘 2024-12-09 09:29:58

IQueryable.Where() 仅适用于 Expression> 作为谓词参数。

IQueryable<T>.Where() only works with Expression<Func<T, bool>> as predicate argument.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文