2011-08-20 17 views
9

Ho il seguente test per Skip take -RavenDB Paging Comportamento

[Test] 
    public void RavenPagingBehaviour() 
    { 
     const int count = 2048; 
     var eventEntities = PopulateEvents(count); 
     PopulateEventsToRaven(eventEntities); 

     using (var session = Store.OpenSession(_testDataBase)) 
     { 
      var queryable = 
       session.Query<EventEntity>().Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()).Skip(0).Take(1024); 

      var entities = queryable.ToArray(); 

      foreach (var eventEntity in entities) 
      { 
       eventEntity.Key = "Modified"; 
      } 

      session.SaveChanges(); 

      queryable = session.Query<EventEntity>().Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()).Skip(0).Take(1024); 

      entities = queryable.ToArray(); 

      foreach (var eventEntity in entities) 
      { 
       Assert.AreEqual(eventEntity.Key, "Modified"); 
      } 
     } 
    } 

PopulateEventsToRaven aggiunge semplicemente 2048 molto semplici documenti al database.

La prima combinazione di take skip ottiene i primi 1024 documenti che modificano i documenti e quindi eseguono le modifiche.

La successiva combinazione di take skip vuole ottenere i primi 1024 documenti ma questa volta ottiene il numero di documento da 1024 a 2048 e quindi fallisce il test. Perché è questo, mi aspetterei di nuovo il primo 1024?

Modifica: ho varificato che se non modifico i documenti il ​​comportamento va bene.

risposta

12

Il problema è che non si specifica un ordine, e ciò significa che RavenDB è libero di scegliere con gli elementi da restituire, che non necessariamente saranno gli stessi elementi che ha restituito nella chiamata precedente. Usa un OrderBy e sarà coerente.