2009-12-27 124 views
2

我有点困惑接口实际代表什么。是一个IQueryable查询还是只能查询一个对象?

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

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

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

我误解了一些东西,还是真的有些模糊?

+0

您是否尝试阅读IQ​​ueryable接口的“备注”部分?它有额外的信息和解释。 – 2009-12-28 19:10:58

回答

2

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

你可能会想到它有点像一个SqlCommand对象 - 它有这个查询,它知道要求数据的内容,但它不包含数据istelf。

+0

但是为什么它被称为IQueryable呢?这是我混乱的主要来源。那么IQuery将是一个更合适的名称。 – Albic 2009-12-28 14:10:31

+0

@Albic:恐怕我不知道命名方面。 – 2009-12-28 17:39:25

1

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

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

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

+0

表达式表示查询本身,对吧?另一方面,IQueryProvider.CreateQuery 方法返回IQueryable 。这个不一致的命名让我感到困惑。 – Albic 2009-12-28 14:18:23

1

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

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

有趣!

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