2016-03-20 147 views
0

我是RavenDb的絕對初學者,但在使用SQL的EF和存儲庫模式方面非常有經驗。最後到處去嘗試一下,所以我使用RavenDB.Embedded創建了一個簡單的控制檯應用程序,目的是在另一個應用程序上替換老化的SQLLite EF實現。RavenDb Stream不返回結果

無論如何,我試圖寫入超過1000條記錄到商店,並簡單地閱讀與流。下面是一些示例代碼:

var store = new EmbeddableDocumentStore 
     { 
      DataDirectory = "data" 
     }; 
     store.Initialize(); 



     using (IDocumentSession session = store.OpenSession()) 
     { 

      for (var t = 1; t < 1000; t++) 
      { 
       var subtest = new Test 
       { 
        Id = new Guid(), 
        SubTest = new SubTest 
        { 
         Name = "NewTest", 
         Id = new Guid() 
        } 
       };      
       session.Store(subtest); 
      } 
      session.SaveChanges(); 
     } 

     store 
      .DatabaseCommands 
      .PutIndex("SubTest/All", 
       new IndexDefinitionBuilder<SubTest>() 
       { 
        Map = tests => tests 
         .Select(test => new 
         { 
          SubTest = test.SubTest, 
          Id = test.Id 
         }) 
       }); 

     using (IDocumentSession session = store.OpenSession()) 
     { 
      var query = session.Query<Test>("SubTest/All"); 

      var listt = query.ToList(); 

      using (var enumerator = session.Advanced.Stream(query)) 
      { 
       while (enumerator.MoveNext()) 
       { 
        var t = enumerator.Current.Document; 
        System.Console.WriteLine(t.Id); 
       } 
      }; 
     } 

     System.Console.ReadLine(); 

我意識到這是很基本的,我沒有那麼多找人來糾正我的代碼。只希望有人能幫助我理解索引事物應該如何與流一起工作,也許可以解釋爲什麼枚舉器沒有結果。如果我使用.Load替代.Query,我會得到結果(其中128個),所以我很確定它的其餘部分正在工作。

我試過上面的PutIndex的東西,但我也嘗試過使用AbstractIndexCreationTask來處理類似的混淆結果。我真的很奇怪地找到關於這個在線的大量信息,這真的很少見嗎?

回答

1

所以我終於明白了這一點。似乎文檔缺少關於Streaming API的幾個關鍵細節。基本上我是在正確的軌道上,我只是不得不在代碼的早期創建索引。我最終使用了AbstractIndexCreationTask,雖然我不知道他們是否在做同樣的事情,但我比PutIndex方法更好。在任何情況下,這個工程:

 var store = new EmbeddableDocumentStore 
     { 
      DataDirectory = "data" 
     }; 
     store.Initialize(); 

     **IndexCreation.CreateIndexes(typeof(TestIndex).Assembly, store);** 

     using (IDocumentSession session = store.OpenSession()) 
     { 

      for (var t = 1; t < 100; t++) 
      { 
       var subtest = new Test 
       { 
        Id = new Guid(), 
        SubTest = new SubTest 
        { 
         Name = "NewTest", 
         Id = new Guid() 
        } 
       }; 
       session.Store(subtest); 
      } 
      session.SaveChanges(); 
     } 


     using (IDocumentSession session = store.OpenSession()) 
     { 
      IQueryable<Test> query = session.Query<Test, TestIndex>(); 

      var enumerator = session.Advanced.Stream(query); 

      while (enumerator.MoveNext()) 
      { 
       var t = enumerator.Current.Document; 
       System.Console.WriteLine(t.Id); 
      } 

     } 

而且我的索引:

public class TestIndex : AbstractIndexCreationTask<Test> 
{ 
    public TestIndex() 
    { 
     this.Map = tests => 
      from t in tests 
      select new 
      { 
       t.Id, 
       t.SubTest 
      }; 
    } 
}  
+1

一個有趣的事情需要注意這個樣本,是第一次運行後,流不返回任何結果。根據我讀過的內容,這是因爲我剛剛添加的數據尚未編入索引,並且流不會等待索引。 – Brandon

+1

PutIndex並創建AbstractIndexCreationTask可以做同樣的事情:創建一個索引。我推薦後者。 –

+1

原始示例沒有返回任何項目,因爲它們尚未建立索引。如果你等待索引是非陳舊的(即完成索引),那麼你會得到結果。 (基本上你已經進入了RavenDB索引的最終一致性)。 – Michael