我是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同样令人困惑的结果。我真的不能在网上找到很多关于这个的信息,这真的很少见吗?
答案 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
};
}
}