IQueryable是查询还是只能查询的对象?

时间:2009-12-27 19:25:44

标签: linq .net-3.5 iqueryable

我对IQueryable界面实际代表的内容感到困惑。

IQueryable的MSDN文档说:“为特定数据源提供评估查询的功能。”

IQueryProvider的文档说:“定义创建和执行IQueryable对象描述的查询的方法。”

名称和文档摘要表明它是可以查询的对象/数据存储。第二个引用和实体框架中ObjectQuery类实现IQueryable的事实表明它是一个可以执行的查询。

我误解了某些东西还是真的有点模糊?

3 个答案:

答案 0 :(得分:2)

IQueryable表示查询本身。它将有一个与之关联的数据源,但它不是数据存储本身。特别是,它通常不会将所有数据都存储在内存中。

您可能会认为它有点像SqlCommand对象 - 它有查询,它知道要求数据的内容,但它不包含数据istelf。

答案 1 :(得分:1)

IQueryable表示可以执行查询的源。它可以表示SQL服务器上的表或内存中的对象集合。

IQueryProvider表示可以创建和执行表达式树所表示的查询的对象。例如,LINQ-to-SQL查询提供程序将获取表达式树并返回IQueryable,允许您在枚举之前枚举(获取结果)或进一步细化(通过编写查询)。

在MSDN上有一个非常好的walkthrough来创建自己的IQueryProvider。我认为如果你做这个演练,你会有更好的理解。

答案 2 :(得分:1)

IQueryable代表两个(可以说是非常不同的)事物。它表示一个查询,其形式为对描述某些代码的表达式树的引用,以及对“知道如何执行查询”的“提供者”的引用形式的数据源。

我认为你的混淆源于这样一个事实:文档只能讨论IQueryable实际定义的方法。 IQueryable的大部分功能来自Queryable类中定义的相关扩展方法的实现,但它们并不是IQueryable接口的严格组成部分。

有趣!

更新:重读您的问题,另一个有用的见解是查询本身可查询。这是在LINQ中实现组合性的关键。所以IQueryable是一个查询,它是可查询的 - 因此类型名称中没有矛盾。