RavenDB C#API:如何在服务器端执行查询过滤器

时间:2016-07-12 15:03:58

标签: c# ravendb nosql

我的Raven数据库中包含Foo类型的超过128个文档:

class Foo {
  public string Id {get; set;}
  public string Name {get; set;}
}

对于两个文档,Name属性的值为"MyName"

使用IDocumentSession session,如果我执行session.query<Foo>().Where(f => f.Name.equals("MyName")),则结果为零。这似乎是因为从RavenDB服务器返回的128个文档中没有返回匹配"MyName"的两个文档(这是默认的客户端页面大小)。因此,客户端API在返回的128个文档上按Name=="MyName"进行过滤,但由于我的两个匹配文档不在前128个文档中,因此找不到匹配的文档。我通过1.在我的浏览器中查看我的RavenDb工作室并验证这两个文档是否存在来验证这个假设,以及2.通过实现无限制的流式查询并成功检索这两个文档:

var results = new List<Foo>();
var query = session.Query<Foo>().Where(f => f.Name.equals("MyName");
using (var enumerator = session.Advanced.Stream(query){
  while (enumerator.MoveNext()){
    results.Add(enumerator.Current.Document);
  }
}

然而,流媒体解决方案对我来说并不理想。我的问题如下:在将128个文档返回给客户端之前,有没有办法要求RavenDB对服务器上的Name执行过滤?我想在我的数据库中搜索我的给定Where过滤器的所有文档,但是一旦应用了过滤器,我完全满足于让服务器将&lt; = 128文档返回到客户端API。

1 个答案:

答案 0 :(得分:2)

您的假设不正确。默认页面大小适用于查询结果,而不适用于您要查询的文档集合(如果这是真的,它将导致左右问题,因为您无法控制首先出现的内容以及最后出现的内容集合)。

您是否实际执行了查询(即调用query.ToList()或类似的东西)? - 如果您这样做,请提供显示查询的更多代码并分配结果。

修改

所以这在我的机器上按预期工作:

[TestFixture]
public class UnitTest3
{
    public class Foo
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }

    private readonly IDocumentStore _documentStore;

    public UnitTest3()
    {
        _documentStore = new EmbeddableDocumentStore
        {
            Configuration =
            {
                RunInUnreliableYetFastModeThatIsNotSuitableForProduction = true,
                RunInMemory = true,
            }
        }.Initialize();
    }

    public void InsertDummies()
    {
        using (IDocumentSession session = _documentStore.OpenSession())
        {
            for (int i = 0; i < 1000; i++)
            {
                Foo foo = new Foo { Name = "Foo" + i };
                session.Store(foo);
            }

            Foo fooA = new Foo { Name = "MyName"};
            session.Store(fooA);
            Foo fooB = new Foo { Name = "MyName" };
            session.Store(fooB);

            session.SaveChanges();
        }
    }

    [Test]
    public void Query()
    {
        List<Foo> result;
        InsertDummies();
        using (IDocumentSession session = _documentStore.OpenSession())
        {
            result = session.Query<Foo>().Where(f => f.Name.Equals("MyName")).ToList();
        }
        Assert.AreEqual(2, result.Count);
    }
}

您是否检查索引是否过时? - https://ravendb.net/docs/article-page/3.0/csharp/indexes/stale-indexes