我对IQueryable
界面实际代表的内容感到困惑。
IQueryable
的MSDN文档说:“为特定数据源提供评估查询的功能。”
IQueryProvider
的文档说:“定义创建和执行IQueryable对象描述的查询的方法。”
名称和文档摘要表明它是可以查询的对象/数据存储。第二个引用和实体框架中ObjectQuery
类实现IQueryable
的事实表明它是一个可以执行的查询。
我误解了某些东西还是真的有点模糊?
答案 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是一个查询,它是可查询的 - 因此类型名称中没有矛盾。