Breeze Predicate не работает при запросе на стороне сервера

У меня есть простой запрос, который игнорирует предикат при запросе с сервера. Все данные возвращаются. После этого, если я включу тот же предикат и запрошу локально, предикаты будут применены. Это нормально? мой предикат и запрос выглядят так

var predicate = breeze.Predicate("active", "==", false) var query = new EntityQuery("Todos").where(predicate);

URL-адрес, отправленный на сервер, выглядит как http://localhost:8888/Items/GetItems?$filter=active%20eq%20false

и метод выглядит так

[HttpGet]
public IQuerable<Items> GetItems() {
   return contextprovider.context.Items();
}

Можно ли фильтровать напрямую с сервера и не загружать все и фильтровать локально?


person jpo    schedule 23.10.2014    source источник


Ответы (2)


Это фильтрация ИС прямо на сервере. Предложение «active = false» объединяется с IQueryable на стороне сервера, прежде чем оно будет выполнено для вашего хранилища данных на стороне сервера. Поэтому, пока хранилище данных понимает, как обрабатывать IQueryable (как это делает EF), вся фильтрация выполняется на сервере в контексте «комбинированного» запроса. Все, что вы на самом деле делаете, — это передаете серверу условия фильтрации, которые сервер будет выполнять в сочетании с указанной конечной точкой. Таким образом, запрос, который выполняется на сервере, на самом деле

contextProvider.context.Items().Where(item => item.active = false);

В качестве альтернативы вы всегда можете избежать «пропуска» условий фильтра, просто изменив реализацию конечной точки вашего сервера, чтобы выполнить фильтрацию явно, т.е.

[HttpGet]
public IQuerable<Items> GetItems() {
   return contextprovider.context.Items().Where(item => item.active = false);
}

В обоих случаях будет выполнен один и тот же запрос.

person Jay Traband    schedule 23.10.2014

Мне не хватало [BreezeController]tag на моем контроллере.

person jpo    schedule 23.10.2014