【问题标题】:Linq to Entities - Internal Behavior of Skip and TakeLinq to Entities - Skip and Take 的内部行为
【发布时间】:2016-06-08 22:03:09
【问题描述】:

我对 Skip and Take 的内部行为有疑问。后续调用 skip 和 take 是否会向前移动内部指针?

所以,换句话说,就是:

var rowset = entities.ActivityRecords
                    .Where(ar => ar.State == (int)LineItemStates.Created 
                        && ar.Timestamp >= cycleIteration.StartDate //within the date range
                        && ar.Timestamp <= cycleIteration.EndDate 
                        && matchingProducts.Contains(ar.ProductId))
                    .OrderBy(ar2 => ar2.Id);

rowset.Skip(10); //only works if we're consuming an iterator and the pointer is moving forward. Does this move an internal pointer forward?
return rowset.Take(10);

相当于:

var rowset = entities.ActivityRecords
                    .Where(ar => ar.State == (int)LineItemStates.Created 
                        && ar.Timestamp >= cycleIteration.StartDate //within the date range
                        && ar.Timestamp <= cycleIteration.EndDate 
                        && matchingProducts.Contains(ar.ProductId))
                    .OrderBy(ar2 => ar2.Id);

return rowset.Skip(10).Take(10);

我正在调查一个错误,我认为问题在于 r.Take(x) 处于循环中,其目的是在每次循环执行时继续采用 x 行,从而消耗整个设置,但我猜后者的代码 sn-p 比前者需要,因为我认为 Skip 和 Take 并没有真正向前移动任何内部指针迭代器。

【问题讨论】:

  • 生成的 sql 中的内部指针?那会很有趣:)。确保不要将 EF Linq 与 Linq-to-Objects 混淆。
  • 另外,rowset.Skip(10) 什么也不做,因为没有返回和重新分配值。它需要是rowset = rowset.Skip(10)

标签: c# entity-framework linq


【解决方案1】:

rowSet.Take(x) 处于一个循环中,其目的是在每次循环执行时保持 x 行,从而消耗整个集合

你是对的,这个错误是由误解引起的。您不能在同一个rowSet 上重复调用Take 并期望得到不同的结果。由于查询是延迟评估的,每次调用都会一次又一次地为您提供相同的十行,并且您的循环不会停止。

【讨论】:

  • 那么在 rowset.Take(x) 的迭代之间调用 entity.SaveChanges() 有什么改变吗?行正在以某种方式发生变异,导致它们不再出现在后续查询中。是否每次都使用新的 SQL 查询重新评估 rowset.Take(x)?否则,我不明白为什么在此之前我们没有看到无限循环行为。
  • @user497745 如果您改变并保存更改,以便处理的行不再在调用Take(x) 之间的结果集中,那么您确实不会看到无限循环。 IQueryable&lt;T&gt; 每次枚举时都会向 RDBMS 发送一个新查询,因此不再符合条件的行不会返回。
  • 优秀。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
  • 2017-05-30
  • 2012-03-28
  • 2012-06-12
相关资源
最近更新 更多