Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq IQueryable是一个查询还是一个可以查询的对象?_Linq_.net 3.5_Iqueryable - Fatal编程技术网

Linq IQueryable是一个查询还是一个可以查询的对象?

Linq IQueryable是一个查询还是一个可以查询的对象?,linq,.net-3.5,iqueryable,Linq,.net 3.5,Iqueryable,我有点搞不清楚IQueryable接口实际上代表了什么 IQueryable的MSDN文档说:“提供了针对特定数据源评估查询的功能。” IQueryProvider的文档中说:“定义创建和执行IQueryable对象所描述的查询的方法。” 名称和文档摘要表明它是一个可以查询的对象/数据存储。第二个引号和实体框架中的ObjectQuery类实现IQueryable这一事实表明它是一个可以执行的查询 是我误解了什么,还是它真的有点模糊?一个IQueryable表示查询本身。它将有一个与之关联的数据源

我有点搞不清楚
IQueryable
接口实际上代表了什么

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

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

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


是我误解了什么,还是它真的有点模糊?

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


您可能会认为它有点像一个
SqlCommand
对象-它有查询,它知道要请求什么数据,但它本身并不包含数据。

一个
IQueryable
表示可以对其执行查询的源。它可以是SQL server上的表的表示形式,也可以是内存中的对象集合

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


关于创建自己的
IQueryProvider
,MSDN上有一个非常好的例子。我认为,如果您进行本演练,您将有更好的理解。

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

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

有趣


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

那为什么叫IQueryable呢?这是我困惑的主要原因。IQuery应该是一个更合适的名字。@Albic:恐怕在命名方面我不知道。表达式表示查询本身,对吗?另一方面,IQueryProvider.CreateQuery方法返回IQueryable。这种不一致的命名让我困惑。您是否尝试阅读IQueryable接口的“备注”部分?它有额外的信息和解释。