2016-03-20 9 views
0

私はRavenDbの初心者ですが、SQLを使用してEFやリポジトリパターンを経験しました。最後に試してみるために、RavenDB.Embeddedを使って簡単なコンソールアプリケーションを作成し、別のアプリケーションでエージングされたSQLLite EF実装を置き換えることにしました。RavenDbストリームは結果を返しません

とにかく、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(); 

私はこれはかなり初歩的であると認識し、私はそんなに私のコードを修正するために誰かを探していません。誰かが、インデックスのものがストリームでどのように動作するのかを理解するのを助けて、なぜ列挙子に結果がないのかを説明することができれば嬉しいです。 .Queryの代わりに.Loadを使用すると結果が得られます(そのうちの128個)ので、残りの部分は動作していることは間違いありません。

私は上記のPutIndexのことを試しましたが、同様の混乱した結果でAbstractIndexCreationTaskを試みました。私は本当に不思議なことに、このオンラインに関する多くの情報を実際に見つけることはできません。これは本当に珍しいことですか?

答えて

1

私はこれを最終的に考え出しました。ストリーミング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

関連する問題