PDA

View Full Version : [C#/Nhibernate]Problema operatore 'LIKE'


RaouL_BennetH
21-05-2009, 09:26
Ciao a tutti :)

Ho questo tipo di problema:

Devo scrivere una funzione che filtri i risultati di una query.



using(ISession session = DBSessionManager.OpenSession())
{
using(ITransaction tx = session.BeginTransaction())
{

IQuery query = session.CreateQuery("from Contatto c where c.Cognome like '" + variable + "%'");
List<Contatto> contatti = (List<Contatto>)query.List<Contatto>();
}
}



Il problema è che non riesco in nessuna maniera a fargli leggere "variable".

Se ovviamente faccio:


"from Contatto c where c.Cognome like 'ben%'"


mi restituisce tutti i contatti che hanno il cognome che inizia per 'ben'.

La mia "variable" è una stringa presa da una textBox.


Grazie mille :)

RaouL.

RaouL_BennetH
21-05-2009, 09:46
Ok... riconsiderando che un ORM 'dovrebbe' farmi dimenticare di scrivere query:




IList contatti = session.CreateCriteria(typeOf(Contatto)).Add(Expression.Like("Cognome", txtFiltro.Text + "%")).List();



Se ci sono altri metodi più eleganti o migliori li accetto volentieri :)

RaouL.

gugoXX
21-05-2009, 11:20
Io userei LINQ to SQL, che ha gli stessi concetti di NHibernate, piu' tanti altri.
E dove potresti scrivere


var MyContact = from contatto in db.Contacts
where contatto.Cognome.StartsWith(variabile)
select c;


E questa istruzione verrebbe compilata e trasformata al volo nell'analoga istruzione SQL con la LIKE corretta.
Tutto strong type e controllato a compile time.

RaouL_BennetH
21-05-2009, 16:23
Io userei LINQ to SQL, che ha gli stessi concetti di NHibernate, piu' tanti altri.
E dove potresti scrivere


var MyContact = from contatto in db.Contacts
where contatto.Cognome.StartsWith(variabile)
select c;


E questa istruzione verrebbe compilata e trasformata al volo nell'analoga istruzione SQL con la LIKE corretta.
Tutto strong type e controllato a compile time.

Sono ancora fermo al net 2.0 con vs 2005 :(

gugoXX
21-05-2009, 23:56
Sono ancora fermo al net 2.0 con vs 2005 :(

Vabbe', ma tanto NHibernate e' una cosa che viene da fuori.

Quindi tanto vale usare cio' che oggi si userebbe per risolvere problemi analoghi.

Se invecevuoi usare il .net20 e solo quanto da lui offerto allora mi fermerei alle ExecuteQuery, ExecuteScalar e ExecuteNonQuery
Con le quali peraltro si possono fare wrapper decisamente potenti, soprattutto se abbinate al concetto dei Generics.

Da quando e' uscito LINQ2SQL le aziende che hanno usato NHibernate l'hanno fatto piu' che altro per continuita' con codice gia' scritto e per non dover riscrivere parti di librerie.
Non penso siano tante quelle che hanno deciso deliberatamente di usarlo.