RavenDb Stream 不返回任何结果

RavenDb Stream returning no results

我绝对是 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,结果也同样令人困惑。我真的很奇怪在网上找不到很多关于这个的信息,这真的那么不常见吗?

所以我终于弄明白了。似乎文档缺少关于流式处理的一些关键细节 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
            };
    }
}