Benvenuto/a Entra | Registrati | Aiuto
in Cerca

NHibernate Icriteria (o HQL) o Stored Procedure ??

Ultimo post 24-09-2007, 9:37 da parte di grava. 0 risposte.
Ordina i post: Precedente Successivo
  •  24-09-2007, 9:37 1325

    NHibernate Icriteria (o HQL) o Stored Procedure ??

    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


     

Visualizza un feed RSS in XML
Powered by Community Server [Telligent Systems]