2013-05-06 8 views
5

Ho una query complessa che restituisce il numero di elementi. Se eseguo una query sul client, restituirà sempre gli oggetti oppure esiste un modo per restituire i conteggi degli articoli senza inviare l'array di oggetti nel payload? Ho provato a fare qualcosa comeConteggi in Breeze.js

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

ma che tira ancora tutti i record verso il basso. Qualche soluzione?

+0

Si sta tentando di caricare tutti gli oggetti e quindi conteggiare o semplicemente ottenere un conteggio degli oggetti nel database? –

+0

no, solo il conteggio. –

risposta

8

Non so se questo risponde esattamente alla tua domanda, ma avresti bisogno di interrogare i record per sapere quanti ce ne sono (per quanto ne so, potrebbe esserci un modo più efficiente per legare Breeze direttamente a comando SQL che è il modo sopra la mia testa) in modo che si possa fare una cosa del genere -

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

cura la risposta - questa sarebbe tornato oggetti e semplicemente ottenere il conteggio.

+0

Un approccio interessante, e anche se sembra un po '"hackish", almeno è molto meglio che prendere 100 oggetti. Mi chiedo cosa abbia da dire @Ward su questo. –

+0

Giusto per chiarire il problema: sto cercando di prendere i conteggi per un oggetto. Un oggetto ha 3 tipi di elementi secondari (A, B, C). Sto mostrando un elenco di elementi (potrebbe essere nelle centinaia) e ognuno di essi deve visualizzare il conteggio totale per ogni tipo di sottotitolo: ad esempio, Item1 (A: 4, B: 10, C: 2) Item2 (A: 23, B: 20, C: 33), ecc. Potrei effettuare la suddetta chiamata su ogni sottotipo per ottenere il suo conteggio, ma con centinaia di voci, è il triplo delle chiamate al server quante il numero di articoli, che potrebbero diventare proibitivi e non scalare molto bene. –

+0

È sia corretto sia hackish ;-) Effettua anche 2 query sul database. Entrambi si verificano sul server, quindi non vi è alcuna penalità di rete. Ma non è carino. Ovviamente probabilmente lo farò da solo fino a quando non avrò la possibilità di creare un metodo di servizio personalizzato sul server come suggerisce Jay. Potrei anche mantenere la query 'inlineCount' se, per qualche improbabile motivo, avessi bisogno di comporre * query ad hoc * sul lato client (ad es.' .where ('Price', 'ge', 100') e mi sono interessata solo numero di tali articoli – Ward

6

La risposta inlineCount già fornita è assolutamente corretta.

Un'altra alternativa è calcolare i conteggi sul server e inviare semplicemente il "riepilogo". Per esempio, questo metodo di controllo lato server restituisce un array di due oggetti elemento al client:

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

Questo sarebbe chiamato tramite

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

Eccellente Per qualche motivo stavo facendo la stessa cosa ma tornando JSON, e Breeze si lamentava che il tipo non era mappato, ma questo funziona decisamente. Grazie. –

-2

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

Problemi correlati