5

Pracuję nad aplikacją javascript dla systemu Windows. Aplikacja korzysta z danych z usług mobilnych typu "azure". Rozważmy poniższy kod:Jak uzyskać liczbę wierszy z bazy danych lazuru?

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

Kod pobiera całą tabelę item i zapisuje go do zmiennej itemTable.

Jaki kod zwróci liczbę wierszy obecnych w itemTable?

Odpowiedz

5

Co szukasz jest metoda includeTotalCount na obiekcie stół/zapytań (niestety brakuje w dokumentacji, będę zgłosić błąd do zespołu produktu, aby mieć go na stałe).

Po wywołaniu read na obiekcie zapytania, będzie on domyślnie zwracał 50 (IIRC, liczba może być różna) elementy z niego, aby uniemożliwić naiwnemu wywołaniu zwracanie wszystkich elementów w bardzo dużej tabeli (a zatem albo ponoszenie koszt przepustowości wychodzącej zarezerwowanych usług lub trafienie przydziału dla wolnych). Zatem uzyskanie wszystkich elementów w tabeli i uzyskanie długości wyników może nie być dokładne.

Jeśli chcesz tylko liczby elementów w tabeli, możesz użyć poniższego kodu: zwracając elementy zero i całkowitą liczbę.

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(); 
    }); 

Jeśli chcesz zapytać pewne elementy, a także całkowitą liczbę (tj stronicowania), wystarczy dodać odpowiednie take() i skip() połączeń, a także includeTotalCount również.

+1

Dziękuję carlosfigueira! To działało :). I czy istnieje sposób zrób ten proces na stronie błękitnej i zwróć wynik liczby wierszy sam do aplikacji klienckiej? –

+0

Byłoby wspaniale dostarczyć prostą metodę 'Query'' .count() ', która zrobiła dokładnie to. Coś jak ...' klient .getTable ('tableName'). count() 'zamiast' read() ' aby uzyskać wynik skalarny; – SliverNinja

+1

Dobry pomysł, przedstawi sugestię zespołowi ds. Produktu. – carlosfigueira

2

Musisz wykonać read() na table query, a następnie uzyskać length wyników.

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

Jeśli tylko pokazujący liczbę rekordu, a nie cały rezultaty - należy po prostu wybrać kolumnę ID w celu zmniejszenia ilości przesyłanych danych. Nie widzę jeszcze metody count() dostępnej w JS Query API, aby wypełnić tę potrzebę.

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

ten Kod faktycznie nie działa. Parametr funkcji przekazywany do funkcji 'then' będzie wykonywany asynchronicznie po zakończeniu żądania sieciowego. Oznacza to, że linia 'var numItems = items.length' zostanie wykonana wcześniej, a' items' będzie w tym punkcie niezdefiniowana. – carlosfigueira

+0

Dziękuję za odpowiedź SilverNinja! Ale w powyższym kodzie "elementy" są wciąż niezdefiniowane po przypisaniu do niego "wyników". Dlatego dodanie "length" do "items" spowodowało następujący błąd: Błąd wykonania JavaScript: Nie można uzyskać właściwości "length" niezdefiniowanej lub zerowej referencji (Uwaga: Baza danych My Azure DB nie jest pusta) –

+0

Spróbuj sprawdzić, czy jesteś uzyskanie błędu podczas operacji 'read()'. Dodaj kolejny parametr do ['then()'] (http://api.jquery.com/deferred.then/) dla 'failFilter' ...' .then (function (results) {...}, function() {alert ("$. read failed"!");)' – SliverNinja

4

Jeśli ktoś przychodzi tutaj i zainteresowani jak uzyskać TOTALCOUNT tylko na C# (jak ja), to jest, jak to zrobić:

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

zasługa tego blogu here

Powiązane problemy