public class Query<T> : IQueryable<T> ...
{
...
public IEnumerator<T> GetEnumerator()
{
return((IEnumerable<T>)this.provider.Execute(this.expression)).GetEnumerator();
}
}
Query<string> someQuery = new Query<string>();
var results1 = someQuery.Select(...).Where(...);
string[] initialSet = { };
var results2 = initialSet.Select(...).Where(...);
在
initialSet
上操作时, Linq 到对象的Where<T>
返回WhereEnumerableIterator<T>
因此results2
类型为WhereEnumerableIterator<T>
。但是在someQuery
上操作时,Where<T>
运算符分配给results1
通过调用someQuery.GetEnumerator
检索的实例或者它还返回一些自定义类?如果是后者,具体是什么时候
someQuery.GetEnumerator
调用Where
和Select
运营商?
最佳答案
results2
的类型只是 Enumerable<T>
- results2
值的实现类型实际上指的是执行时恰好是WhereEnumerableIterator<T>
,仅此而已。
在 someQuery
上操作时,这取决于你用它做什么 - results1
的类型变量是 IQueryable<T>
,这样您可以使用更多 Queryable
调用它。
someQuery.GetEnumerator()
可能永远被调用 - 由查询提供者实现来确定如何表示查询;它不需要调用GetEnumerator
像 LINQ to Objects 通常所做的那样,一直沿着链向上。
至于Queryable.Where
返回的对象类型- 同样,这取决于查询提供程序的实现 - 区别在于,知识被烘焙到 Enumerable.Where
中并且无法更换,Queryable.Where
会将调用链接到查询提供程序。
关于linq - 关于 IQueryable<T>.GetEnumerator 的一些令人困惑的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7573981/