Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq到实体-跳过和执行的内部行为_C#_Entity Framework_Linq - Fatal编程技术网

C# Linq到实体-跳过和执行的内部行为

C# Linq到实体-跳过和执行的内部行为,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个关于“跳过并执行”的内部行为的问题。后续的skip和take调用是否将内部指针向前移动 换句话说,就是: var rowset = entities.ActivityRecords .Where(ar => ar.State == (int)LineItemStates.Created && ar.Timestamp >= cycleIteration.StartDate

我有一个关于“跳过并执行”的内部行为的问题。后续的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>=cycleetilation.StartDate//在日期范围内
&&ar.时间戳ar2.Id);
行集.跳过(10)//仅当我们使用迭代器并且指针向前移动时才有效。这是否会向前移动内部指针?
返回行集。取(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);
var rowset=entities.ActivityRecords
.Where(ar=>ar.State==(int)LineItemStates.Created
&&ar.Timestamp>=cycleetilation.StartDate//在日期范围内
&&ar.时间戳ar2.Id);
返回行集。跳过(10)。获取(10);
我正在调查一个bug,我认为问题在于r.Take(x)处于循环中,其目的是在每次循环执行时继续获取
x
行,从而消耗整个集合,但我猜后一个代码段比前一个代码段更重要,因为我认为Skip和Take并没有真正向前移动任何内部指针迭代器

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


你是对的,这个错误是由误解引起的。不能对同一行集反复调用
Take
,并期望得到不同的结果。由于查询是惰性计算的,每次调用都会一次又一次地得到相同的十行,循环不会停止。

生成的sql中是否有内部指针?那将非常有趣:)。请确保不要将EF Linq与Linq-to-Objects混淆。此外,
行集。跳过(10)
不会执行任何操作,因为该值不会返回和重新分配。它需要是
rowset=rowset.Skip(10)
。在rowset的迭代之间调用entities.SaveChanges()也需要这样做。Take(x)更改任何内容吗?行的变异方式将导致它们不再出现在后续查询中。是否每次都使用新的SQL查询重新计算rowset.Take(x)?否则,我不明白为什么在此之前我们没有看到无限循环行为。@user497745如果您更改并保存更改,使处理的行不再位于调用
Take(x)
之间的结果集中,那么您确实不会看到无限循环
IQueryable
每次枚举时都会向RDBMS发送一个新查询,因此不再符合条件的行不会返回。非常好。谢谢你的帮助。