2013-05-06 2 views
5

У меня есть сложный запрос, который возвращает количество элементов. Если я запустил запрос на клиенте, он всегда будет возвращать объекты или есть способ просто вернуть количество элементов без отправки массива объектов в полезную нагрузку? Я попытался сделать что-то вродеПодсчитывает в Breeze.js

var query = breeze.EntityQuery.from('Items').inlineCount(true); 

но это все еще тянет все записи вниз. Любые решения?

+0

Вы пытаетесь загрузить все объекты, а затем подсчитать или просто получить количество объектов в базе данных? –

+0

нет, только кол-во. –

ответ

8

Я не знаю, отвечает ли этот вопрос на ваш вопрос, но вам нужно будет запросить записи, чтобы узнать, сколько их есть (насколько мне известно, может быть более эффективный способ связать Бриз прямо в команда SQL, которая является путь над моей головой), так что вы могли бы сделать что-то вроде -

var query = breeze.EntityQuery.from('Items') 
    .take(0) 
    .inlineCount(true); 

Edited ответ - это не вернет ни одного объекта и просто получить счетчик.

+0

Интересный подход, и хотя он чувствует себя немного «взломанным», по крайней мере, это намного лучше, чем захват 100 предметов. Интересно, что @Ward должен сказать об этом. –

+0

Как раз для того чтобы уточнить проблему: Я пытаюсь захватить счеты для деталя. Элемент имеет 3 типа подэлементов (A, B, C). Я показываю список элементов (может быть в сотнях), и каждый из них должен отображать общий счетчик для каждого типа подтипа: например, Item1 (A: 4, B: 10, C: 2) Item2 (A: 23, B: 20, C: 33) и т. Д. Я мог бы сделать вышеупомянутый вызов для каждого подтипа, чтобы получить его счет, но с сотнями элементов, что в 3 раза больше звонков на сервер, так как количество предметы, которые могут стать непомерно высокими и не очень хорошо масштабироваться. –

+0

Это и правильное и хакерское ;-) Он также делает 2 запроса к базе данных. Оба происходят на сервере, поэтому нет сетевого штрафа. Но это не приятно. Конечно, я бы сделал это сам, пока у меня не было возможности создать на сервере собственный метод обслуживания, как предлагает Джей. Я мог бы также сохранить запрос 'inlineCount', если бы по какой-то маловероятной причине мне пришлось составлять * клиентские запросы * ad hoc * (например,' .where ('Price', 'ge', 100') и заботились только о количество таких предметов – Ward

6

Правильный ответ inlineCount является абсолютно правильным.

Другой вариант - рассчитать подсчеты на сервере и просто отправить «резюме». Например, этот сервер метод на стороне контроллера будет возвращать массив из двух элементов объектов к клиенту:

[HttpGet] 
    public Object CustomerCountsByCountry() { 
    return ContextProvider.Context.Customers.GroupBy(c => c.Country).Select(g => new {g.Key, Count = g.Count()}); 
    } 

Это будет называться с помощью

EntityQuery.from("CustomerCountsByCountry") 
    .using(myEntityManager).execute() 
    .then(function(data) { 

    var results = data.results; 
    results.forEach(function(r) { 
     var country = r.Key; 
     var count = r.Count 
    }); 

    }); 
+0

Отлично. По какой-то причине я делал то же самое, но возвращал JSON, и Бриз жаловался, что тип не был отображен, но это определенно работает. –

-2

вар запроса = breeze.EntityQuery.from («Предметы») .take (0) .inlineCount (true);