【发布时间】: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