关于 IQueryable.GetEnumerator 的一些令人困惑的事情

发布于 2024-12-06 13:08:56 字数 947 浏览 2 评论 0原文

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-to-object 的 Where 返回 WhereEnumerableIterator,因此 results2< /code> 的类型为 WhereEnumerableIterator。但是,当对 someQuery 进行操作时,Where 运算符是否将通过调用 someQuery.GetEnumerator 检索到的实例分配给 results1 > 还是它还返回一些自定义类?

  2. 如果是后者,WhereSelect 运算符何时调用 someQuery.GetEnumerator

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. When operating on initialSet, Linq-to-object's Where<T> returns WhereEnumerableIterator<T> and thus results2 is of type WhereEnumerableIterator<T>. But when operating on someQuery, does Where<T> operator assign to results1 an instance retrieved by calling someQuery.GetEnumerator or does it also return some custom class?

  2. If the latter, when exactly is someQuery.GetEnumerator called by Where and Select operators?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

木緿 2024-12-13 13:08:56

results2 的类型只是 Enumerable - results2 值实际的实现类型执行时所指的恰好是 WhereEnumerableIterator,仅此而已。

someQuery 上操作时,这取决于您用它做什么 - results1 变量的类型是 IQueryable,因此您可以对其使用更多Queryable调用。

someQuery.GetEnumerator() 可能永远被调用 - 由查询提供程序实现来确定如何准确地表示查询;它不需要像 LINQ to Objects 通常那样调用 GetEnumerator

至于 Queryable.Where 返回的对象类型 - 同样,这取决于查询提供程序的实现 - 区别在于,而知识被烘焙到 Enumerable.Where 中,并且无法替换,Queryable.Where 会将调用链接到查询提供程序。

The type of results2 is just Enumerable<T> - the type of the implementation that the value of results2 actually refers to at execution time happens to be WhereEnumerableIterator<T>, that's all.

When operating on someQuery, it depends what you do with it - the type of the results1 variable is IQueryable<T>, so you can use more Queryable calls on it.

someQuery.GetEnumerator() may never be called - it's up to the query provider implementation to work out exactly how to represent the query; it doesn't need to call GetEnumerator all the way up the chain like LINQ to Objects typically does.

As for the type of object returned by Queryable.Where - again, that's up to the query provider implementation - the difference is that whereas the knowledge is baked into Enumerable.Where and can't be replaced, Queryable.Where will chain the call through to the query provider.

送君千里 2024-12-13 13:08:56

如果是后者,someQuery.GetEnumerator 到底是什么时候被调用的
Where 和 Select 运算符?

当查询被枚举时。因此得名。

initialSet.Select(...).Where(...);

这看起来是错误的。您可以使用“筛选位置”和“选择”来投影结果。你似乎把它搞反了。

If the latter, when exactly is someQuery.GetEnumerator called by
Where and Select operators?

When the query is enumerated. Hence comes the name.

initialSet.Select(...).Where(...);

This looks wrong. You use the Where to filter, and the Select to project the result. You appear to have it backwards.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文