我对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
行并因此消耗整个集合,但我猜测后者的代码片段是前者需要的,因为我不认为Skip和Take真正移动任何内部指针迭代器。
答案 0 :(得分:2)
rowSet.Take(x)
处于一个循环中,其目的是在每次循环执行时继续占用x行,从而消耗整个集合
你是对的,这个错误是由一个误解引起的。您无法在同一Take
上重复调用rowSet
,并期望获得不同的结果。由于查询被懒惰地评估,每次调用会一次又一次地获得相同的十行,并且你的循环不会停止。