Spesso per migliorare le performance delle applicazioni mi ritrovo a usare una foreach select (readonly).
Di recente è stato aggiunto il metodo forEachCount() per conoscere dentro il foreach il totale delle righe.
Sempre per motivi di performance a volte non vorrei eseguire la query se il conteggio è zero.
Esempio: in una videata clienti non voglio mostrare il pulsante "mostra fatture" se il conteggio delle fatture è zero. Se però il cliente ha 100000 fatture devo tirarle su tutte solo per contare. L'esempio è infelice, lo so, ma il concetto è: uscire dal foreach "prima di lanciare la query"...
Ora in questo esempio io carico le fatture con una foreach select e dentro al loop se forEachCount è 0 faccio break.
Il workaround è fare una select into variables count query duplicando la query foreach, però mi tocca scrivere due query quasi uguali (una per il select into variables e una per il foreach) che è una duplicazione di codice "fastidiosa".
C'è un modo per farlo o sarebbe una proposta di modifica?
Quello che ho in mente è: quando si fa una foreach select:
1. prima inde fa in automatico una count query
2. lo sviluppatore ha a disposizione un modo per scrivere del codice nel caso di count 0 e eventualmente fare break
2. quindi inde fa la query vera e si prosegue al modo solito
Per intenderci, qualcosa del genere:
- Code: Select all
for each row (readonly)
{
select
IDFattura= Fatture.IDFattura
importo= Fatture.Importo
altriCampi= AltreTabelle.AltriCampi
from
Fatture// master table
AltriCampi// joined with Fatture...
where
CONDITION
specialCodeForForEachCountZero -- nota: questa è un'area speciale dentro il foreach che inde mi metterebbe a disposizione per gestire il caso forEachCount()==0
{
this.totaleFattureCount = 0
break
}
normalCodeForForEachCountGreaterThanZero -- nota: questa è un'area speciale dentro il foreach che corrisponde a quello che si fa attualmente in un foreach dopo la query
{
faiQuelloCheDeviFare
}
}
avendo a disposizione "l'area di codice" specialCodeForForEachCountZero avrei modo di evitare di lanciare la query principale in modo facile.
Il workaround attualmente possibile è
- Code: Select all
// prima conto a mano
int vCount = 0
select into variables (found variable)
set vCount = count([expression])
from
Fatture// master table
AltriCampi// joined with Fatture...
where
CONDITION
// in caso di conteggio zero faccio quello che devo fare
if vCount ==0
{
this.totaleFattureCount = 0
}
// altriementi lancio la query (che potrebbe anche essere molto impegnativa)
else
{
for each row (readonly)
{
select
IDFattura= Fatture.IDFattura
importo= Fatture.Importo
altriCampi= AltreTabelle.AltriCampi
from
Fatture// master table
AltriCampi// joined with Fatture...
where
CONDITION
faiQuelloCheDeviFare
}
C'è un modo per fare già (senza il workaround) il conteggio?
Grazie!