Credo che tu non abbia afferrato il concetto di base del problema...!
La soluzione di Allen, concettualmente è da ignorare se usi un SERVER SQL perchè obbliga sempre il Server a restituire tutto il Dataset... la funzione ECOUNT come DCOUNT è interpretabile solo da Access... non dal server.
Ho il sospetto che manchi qualche BASE formativa per parlare la stessa lingua...!
Cerco di farti capire meglio... non confondere mai il CLIENT con il SERVER, purtroppo chi non ha esperienza ed inizia con Access subisce deformazioni non facilmente controllabili...!
Se fai elaborare i dati al SERVER... questo è VELOCE e restituisce solo i dati corrispondenti... se fai interpretare ad Access il predicato fai fallire il lavoro del Server e lo sposti a JET che è lento.
Ti faccio un'esempio per farti capire meglio
Esempio 1
Questa Query SELECT viene eseguita SERVER_SIDE e restituirà 1 solo Record corrispondente
SELECT * FROM T1 WHERE Id=1
In questo caso hai la MASSIMA EFFICIENZA.
Esempio 2
Questa Query viene eseguita in 2 tempi:
SELECT * FROM T1 WHERE Id=Forms!NomeForm!ID
Nonostante [Forms!NomeForm!ID]=1, quindi lo stesso valore del predicato precedente, il SERVER SQL non ha la più pallida idea di cosa sia [Forms!NomeForm!ID]... quindi non è in grado di interpretarla...!
Cosa può fare il SERVER in questo caso, fregarsene del CRITERIO, ed eseguirà questa
SELECT * FROM T1
Poi JET applicherà al risultato della 1° query il CRITERIO perchè solo JET è in grado di risolvere l'espressione...
Cosa hai ottenuto in questo caso....?
Alla fine del risultato sarà la stessa cosa, ma mentre nel 1° caso ha lavorato correttamente il motore del DB(PostGree) ottimizzando sia i tempi di esecuzione sia il numero dei dati inviati in rete, nel 2° caso hai fatto lavorare inutilmente il Server(PostGree) obbligandolo ad inviare TUTTO IL MALLOPPONE, hai fatto lavorare inutilmente JET che è lento di suo...!
Questo processo per è è trasparente e se non hai dimestichezza con i sistemi CLIENT-SERVER, con i TOOLS di sviluppo e di diagnostica propri degli RDBMS non sei in grado di sviluppare applicazioni CLIENT-SERVER degne di essere chiamate tali...!
Quindi riassumendo una SubQuery che viene interpretata SERVERSIDE che faccia la stessa cosa che fa il DCOUNT si scrive in modo diverso... simile a questo:
SELECT *, (Select COUNT(*) FROM ORDINI WHERE Ordini.CodiceCliente=Clienti.[CodiceCliente]) As NumOrdini FROM Clienti
Come vedi la SUBQuery è semplice completamente interpretabile dal SERVER e, se hai strutturato in modo corretto INDICI e CHIAVI vedrai che ha una velocità di esecuzione elevata.
Poi ci sono molte altre cose che dovresti approfondire, come l'uso delle StoredProcedure(che proprio in questo caso si adattano ad essere usate) soprattutto quando devi ottenere Query in sola LETTURA, le Query PASSTROUGHT che si usano per le STORED PROCEDURE/VISTE scritte direttamente serverside....
Insomma passare da Access-JET ad Access-RDBMS serve fare passaggi che non sono il semplice uso del DB... ma serve studiare molti altri aspetti.