我正在使用RavenDB流API使用以下代码从我的数据库实例中检索所有355,000 DocsToProcess
:
_myDocs = new List<DocsToProcess>();
var query = RavenSession.Query<DocsToProcess>();
using (var enumerator = RavenSession.Advanced.Stream(query))
{
while (enumerator.MoveNext())
{
DocsToProcess u = enumerator.Current.Document;
_myDocs.Add(u);
}
}
但是,抛出以下异常消息:
StreamQuery does not support querying dynamic indexes. It is designed to be used with large data-sets and is unlikely to return all data-set after 15 sec of indexing, like Query() does.
如何在C#应用程序中正确迭代DocsToProcess
类型的所有元素?
答案 0 :(得分:3)
documentation says explicitly for unbound results:
重要的附注:
- 索引已存在。创建索引不会发生,查询错误带有IndexDoesNotExistsException异常。
这就是你的例外所说的。您必须为流式搜索结果创建static index。
答案 1 :(得分:1)
与上面的JHo类似,我提出的解决方案意味着您不需要为流式传输创建静态索引,因为您依赖于默认索引并使用StartsWith
Raven客户端中Stream<T>
的重载。
我们发现下面的解决方案适用于我们需要从Raven实例获取所有的大多数用例。
public IEnumerable<T> GetAll()
{
var results = new List<T>();
var conventions = _documentStore.Conventions ?? new DocumentConvention();
var defaultIndexStartsWith = conventions.GetTypeTagName(typeof(T));
using(var session = _documentStore.OpenSession())
{
using(var enumerator = session.Advanced.Stream<T>(defaultIndexStartsWith))
{
while(enumerator.MoveNext())
results.Add(enumerator.Current.Document);
}
}
return results;
}
答案 2 :(得分:0)
为了在不创建静态索引的情况下,你可以提供一些这样的最小边界:
using (var session = store.OpenSession())
{
IEnumerator<StreamResult<Employee>> stream =
session.Advanced.Stream<Employee>("employees/");
while (stream.MoveNext())
{
// ....
}
}