我有点困惑接口实际代表什么。是一个IQueryable查询还是只能查询一个对象?
IQueryable
的MSDN文档说:“提供了针对特定数据源的评估查询的功能。”
IQueryProvider
的文档说:“定义创建和执行由IQueryable对象描述的查询的方法。”
名称和文档摘要表明它是可以查询的对象/数据存储。第二个引号和实体框架的ObjectQuery
类实现IQueryable
的事实表明它是一个可以执行的查询。
我误解了一些东西,还是真的有些模糊?
我有点困惑接口实际代表什么。是一个IQueryable查询还是只能查询一个对象?
IQueryable
的MSDN文档说:“提供了针对特定数据源的评估查询的功能。”
IQueryProvider
的文档说:“定义创建和执行由IQueryable对象描述的查询的方法。”
名称和文档摘要表明它是可以查询的对象/数据存储。第二个引号和实体框架的ObjectQuery
类实现IQueryable
的事实表明它是一个可以执行的查询。
我误解了一些东西,还是真的有些模糊?
IQueryable
代表查询本身。它将有一个与之关联的数据源,但它不是数据存储本身。特别是,它通常不会存储所有的数据。
你可能会想到它有点像一个SqlCommand
对象 - 它有这个查询,它知道要求数据的内容,但它不包含数据istelf。
但是为什么它被称为IQueryable呢?这是我混乱的主要来源。那么IQuery将是一个更合适的名称。 – Albic 2009-12-28 14:10:31
@Albic:恐怕我不知道命名方面。 – 2009-12-28 17:39:25
IQueryable
表示可以针对其执行查询的源。它可以是SQL服务器上的表格或内存中对象集合的表示。
IQueryProvider
表示可以创建和执行由表达式树表示的查询的对象。例如,LINQ-to-SQL查询提供程序将采用表达式树并返回一个IQueryable
,该列表允许您在枚举之前枚举(通过编写查询)来进行枚举(以获得结果)或进一步优化。
MSDN上有一个非常好的walkthrough创建自己的IQueryProvider
。我认为如果你做这个演练,你会有更好的理解。
表达式表示查询本身,对吧?另一方面,IQueryProvider.CreateQuery
IQueryable表示两个(可以说是非常不同的)事物。它以引用形式描述某些代码的表达式树和数据源的形式,以对提供者的引用的形式表示查询,该提供者知道如何执行查询。
我认为你的困惑源于文档只能谈论IQueryable实际定义的方法这一事实。 IQueryable的大部分功能来自其在Queryable类中定义的相关扩展方法的实现,但它们不是IQueryable接口的严格组成部分。
有趣!
更新:重读您的问题,另一个有用的见解是,查询本身是可查询。这是启用LINQ组合性的关键。所以IQueryable是一个查询,它是可查询的 - 所以在类型名称中没有矛盾。
您是否尝试阅读IQueryable接口的“备注”部分?它有额外的信息和解释。 – 2009-12-28 19:10:58