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
};
}
}
我绝对是 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
};
}
}