2016-03-20 151 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