Linq to Entities - Skip and Take的内部行为

时间:2016-06-08 22:03:10

标签: c# entity-framework linq

我对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真正移动任何内部指针迭代器。

1 个答案:

答案 0 :(得分:2)

  

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

你是对的,这个错误是由一个误解引起的。您无法在同一Take上重复调用rowSet,并期望获得不同的结果。由于查询被懒惰地评估,每次调用会一次又一次地获得相同的十行,并且你的循环不会停止。