使用流api检索数据

时间:2015-02-16 20:18:41

标签: c# .net ravendb

我正在使用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类型的所有元素?

3 个答案:

答案 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())
        {
            // ....
        }
    }