2011-05-11 8 views
10

Ho cercato in internet e non riesce a trovare un esempio su come utilizzare la queryover di NHibernate 3.0 Per esempio vorrei utilizzare le funzioni di stringa sulla clausola WHERE della queryover es:Posso usare le funzioni SQL in NHibernate QueryOver?

var item = Query.Where(x => x.Name.ToLower() == name.ToLower()).FirstOrDefault(); 

Ma questo non funziona, perché Nhibernate non può capire il ToLower, quindi come può estendere il dialetto in un modo che questo sia possibile?

risposta

9
session.QueryOver<Foo>() 
    .Where(Restrictions.Eq(
     Projections.SqlFunction("lower", NHibernateUtil.String, 
      Projections.Property<Foo>(x => x.Name)), 
     name.ToLower())) 

dovrebbe farti SQL come where lower(Name) = @p0

+0

Ciao, grazie per la risposta ha funzionato davvero, non sai per quanto tempo e tanto ho cercato questa soluzione. Grazie –

+0

@Ruben Monteiro nessun problema, trovo che a volte è necessario mescolare in alcuni criteri quando si lavora con QueryOver. – dotjoe

0

credo che funziona, almeno nella build che sto usando (versione 3.0.0.4000) ... sotto è il mio esempio ...

var reasons = _session.Query<Reason>(); 
var myReason = (from r in reasons 
       where r.IsCritical 
        && r.ReasonCode.ToUpper() == reasonCode.ToUpper() 
       select r).FirstOrDefault(); 

dare un colpo e fammi sapere se funziona per voi ...

+0

questo si traduce in una clausola WHERE che utilizza la funzione a SQLServer UPPER() ... (che potrebbe essere un male per le prestazioni ... fyi) – Todd

+0

Ho provato questa query var = Session.GetISession(). QueryOver (); var item = (da f nella query dove f.Description.ToLower() == description.ToLower() seleziona f) .List(). FirstOrDefault (); e ho ricevuto questo errore Chiamata di metodo non riconosciuta in epression f.Description.ToUpper(), la mia versione di nHibernate se la 3.1.0.4000, @Todd - Conosco il problema di prestazioni ma ho bisogno di implementarlo in questo modo –

+0

Interessante ... il tuo diritto non funziona quando usi la sintassi QueryOver ... la mia ipotesi è un giorno che si aggiusterà ... A seconda delle tue esigenze potresti usare la sintassi Query per questo e dovrebbe funzionare ... il tuo codice sarebbe aggiornato come segue ... – Todd