Ciao a tutti,
Sto facendo un porting di una vecchia applicazione asp in .NET. Tale applicazione ha un numero indicibile di stored procedure "inutili" che sono state fino ad ora "evitate" con l'uso di NHibernate.
Esiste però una procedura di ricerca che genera una stringa sql da lanciare a seconda dei parametri passati alla stored procedure. Siccome questo tipo di interrogazioni non mi sono mai piaciute, mi chiedevo come trasformare tale procedura in una query fatta con ICriteria o con HQL che sia al contempo veloce e leggera.
In parole povere la procedura controlla l'esistenza di valori in determinate variabili passate alla stessa ed in base alla loro presenza mette in join la tabella necessaria e mette in Where il valore passato.
Es. (sp(citta='', ruolo='zzz')), produce una query simile a:
select
*
from
utente u inner join ruolo r
where
u.ruolo = r.ruolo
and r.descRuolo = 'zzz'
bene, fin qui nulla di preoccupante, a livello di Criteria aggiungo (Expression.Eq) solo sulle proprietà mappate in base a quelle valorizzate:
ICriteria crit = Session.CreateCriteria(typeof(Utente));
if (!String.IsNullOrEmpty(txtCitta.Text))
crit.Add(Expression.Eq(txtCitta.Text,"Citta"));
if (!String.IsNullOrEmpty(txtRuolo.Text))
crit.Add(Expression.Eq(txtRuolo.Text,"Ruolo"));
Eccetera.
Il problema nasce dal fatto che la sp, nel caso vengano passati due parametri (citta di partenza e raggio chilometrico) permette di ricercare gli utenti in base alla distanza che intercorre tra la citta di partenza passata e quella di domicilio dell'utente (dove la distanza deve essere <= al raggio passato). Questo tipo di calcolo viene fatto a livello di SP con una join con inner select che è di questo tipo:
Select
*
from
utente u,
(select
upper(dis.citta2) as comune
from
(SELECT c1.codice_istat as citta1, c2.codice_istat as citta2, 6371 *
acos ((sin (RADIANS( c1.latitudinedec )) * sin (RADIANS( c2.latitudinedec ))) +
(cos (RADIANS( c1.latitudinedec )) * cos (RADIANS( c2.latitudinedec ))*
cos (RADIANS(c2.longitudinedec)-RADIANS(c1.longitudinedec)))) as distanza
FROM mts_comuni AS c2, mts_comuni AS c1
WHERE c1.codice_istat = ''' + @codIstatCap + ''') as dis
where
dis.distanza <= ' + cast(@raggioKM as varchar(20)) + ') as COMUNI
where
u.citta = comuni.comune
Sono due giorni che cerco di trovare una soluzione a questo problema, e più passa il tempo più penso che dovrò lasciare questa maledetta stored Procedure (che vi assicuro è assolutamente illeggibile!).
Ringrazio anticipatamente chiunque possa darmi una mano !
Grazie mille per l'attenzione.
Gianluca Gravina