2016-07-12 3 views
1

У меня есть более 128 документов, в моей базе данных Raven типа Foo:RavenDB C# API: Как выполнить фильтр запроса на стороне сервера

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")), я получаю нулевые результаты. Это связано с тем, что два документа, которые соответствуют "MyName", не возвращаются в 128 документах, возвращенных с сервера RavenDB (это размер страницы на клиентской стороне по умолчанию). Таким образом, клиентский API фильтрует по Name=="MyName" по 128 документам, но поскольку мои два совпадающих документа не были среди первых 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); 
    } 
} 

Однако, потоковое решение не идеально для меня. Мой вопрос заключается в следующем: есть ли способ попросить RavenDB выполнить фильтр по имени на сервере, прежде чем возвращать 128 документов клиенту? Я хочу выполнить поиск по всем документам в моей базе данных для моего заданного фильтра Where, но как только фильтр применяется, я совершенно доволен тем, что сервер возвращает < = 128 документов API-интерфейсу клиента.

ответ

2

Неверное ваше допущение. Размер страницы по умолчанию применяется к результату запроса, а не к коллекции документов, на которую вы запрашиваете (если это действительно так, это может привести к уродливым проблемам влево и вправо, поскольку вы не можете контролировать то, что на первом месте, и что происходит последним в коллекция).

Выполняете ли вы запрос (т. Е. Вызываете query.ToList() или что-то похожее)? - Если да, предоставьте дополнительный код, показывающий ваш запрос и назначающий результат.

EDIT

Так что здесь работает, как ожидается, на моей машине:

[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

+0

Метод по существу возвращает 'List ', и я возвращаю 'query.ToList()'. Спасибо, я думал, что это не так. Я собираюсь поиграть с ним немного больше сегодня и посмотреть, могу ли я понять, почему я вижу это поведение. – kjb4

Смежные вопросы