linq - 关于 IQueryable<T>.GetEnumerator 的一些令人困惑的事情

标签 linq iqueryable

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(...);
  1. initialSet 上操作时, Linq 到对象的 Where<T>返回WhereEnumerableIterator<T>因此results2类型为WhereEnumerableIterator<T> 。但是在 someQuery 上操作时,Where<T>运算符分配给results1通过调用 someQuery.GetEnumerator 检索的实例或者它还返回一些自定义类?

  2. 如果是后者,具体是什么时候 someQuery.GetEnumerator调用 WhereSelect运营商?

最佳答案

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/

相关文章:

c# - 实现IQueryable包装器来转换结果对象

c# - 在连接到 CRM 的 LINQ 表达式中排除数组

.net - 交叉类型 LINQ

asp.net - IQueryable & Repositories - 拿 2 个?

wpf - 当itemsource在某些计算机上可查询或可枚举时,Datagrid不会生成列

c# - 无法合并 EF 中的两个函数结果

C# LINQ - 读取 XML

c# - 使用字符串操作和正则表达式的 LINQ 查询结果

C# : How to compare Dictionary Values?

c# - 无法按索引访问 IQueryable<T> 的项目