5

Работаю в приложении javascript для Windows Store. Приложение использует данные из лазурных мобильных сервисов. Рассмотрим следующий код:Как получить количество строк из базы данных azure?

var itemTable = mobileService.getTable('item'); 
//item is the table name stored in the azure database 

код извлекает всю таблицу item и сохраняет его в переменной itemTable.

Какой код вернет число строк, присутствующих в itemTable?

ответ

5

Что вы ищете является includeTotalCount метод на объекте таблицы/запроса (к сожалению, не хватает в документации, я подам ошибка в команде продукта, чтобы он фиксирован).

Когда вы вызываете read на объект запроса, он будет возвращать по умолчанию 50 элементов (IIRC, число может отличаться) от него, чтобы предотвратить наивный вызов от возврата всех элементов в очень большой таблице (таким образом, стоимость исходящей полосы пропускания для зарезервированных услуг или попадание в квоту для бесплатных). Поэтому получение всех элементов в таблице и получение результатов могут быть неточными.

Если все, что вы хотите, это количество элементов в таблице, вы можете использовать следующий код: возврат нулевой элементов и общее количество.

var table = client.getTable('tableName'); 
    table.take(0).includeTotalCount().read().then(function (results) { 
     var count = results.totalCount; 
     new Windows.UI.Popups.MessageDialog('Total count: ' + count).showAsync(); 
    }); 

Если вы хотите запросить некоторые элементы, а также включает в себя общее количество (т.е. для подкачки), просто добавьте соответствующие take() и skip() вызовов, а также includeTotalCount, а также.

+1

Спасибо, Карлосфигера! Это сработало :). И есть ли способ выполните этот процесс на лазурной стороне и верните результат подсчета строк только для клиентского приложения? –

+0

Было бы здорово предоставить простой метод 'Query'' .count() ', который сделал именно это. Что-то вроде ...' client .getTable ('tableName'). count() 'вместо' read() ' получить скалярный результат; – SliverNinja

+1

Хорошо, напишите предложение с командой продукта. – carlosfigueira

2

Вам необходимо выполнить read() на table query, а затем получить length результатов.

var items, numItems; 
itemTable.read().then(function(results) { items = results; numItems = items.length; }); 

Если вы только показывает количество записей, а не весь результат - вы просто должны выбрать столбец ID, чтобы уменьшить количество передаваемых данных. Я еще не вижу способ count(), доступный еще в JS Query API для заполнения этой потребности.

var itemTable = mobileService.getTable('item').select('itemID'); 
+0

Это код на самом деле не будет работать. Параметр функции, переданный функции 'then', будет выполняться асинхронно после завершения сетевого запроса. Это означает, что перед этим будет выполняться строка 'var numItems = items.length', а' items' будет неопределенной в этой точке. – carlosfigueira

+0

Спасибо за ваш ответ SilverNinja! Но в приведенном выше коде «элементы» по-прежнему не определены после присвоения ему «результатов». И, следовательно, добавление «длины» в «элементы» вытолкнуло следующую ошибку: Ошибка выполнения JavaScript: не удалось получить длину свойства неопределенной или нулевой ссылки (Примечание: моя Azure DB не пуста) –

+0

Попробуйте проверить, возвращая ошибку во время операции 'read()'. Добавьте еще один параметр в '' then() '] (http://api.jquery.com/deferred.then/) для функции' failFilter' ... .then (function (results) {...}, function() {alert ("$. read failed!");)' – SliverNinja

4

Если кто-то приходит сюда и заинтересован в том, чтобы получить TOTALCOUNT только на C# (как я), то это, как вы это делаете:

var table = MobileService.GetTable<T>(); 
var query = table.Take(0).IncludeTotalCount(); 
IList<T> results = await query.ToListAsync(); 
long count = ((ITotalCountProvider)results).TotalCount; 

Заслуга в этом блоге here

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