RavenDb Stream没有返回任何结果

时间:2016-03-20 01:47:14

标签: ravendb

我是RavenDb的绝对初学者,但在使用SQL的EF和存储库模式方面非常有经验。最后试着尝试一下,所以我使用RavenDB.Embedded创建了一个简单的控制台应用程序,目的是在另一个应用程序上替换老化的SQLLite EF实现。

无论如何我试图将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 个答案:

答案 0 :(得分: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
            };
    }
}    
相关问题