2011-05-11 13 views
10

que han estado buscando el Internet y no puede encontrar un ejemplo de cómo utilizar el queryover de nhibernate 3.0 Por ejemplo, me gustaría utilizar las funciones de cadena en la cláusula where de la ex queryover :¿Puedo usar funciones de SQL en NHibernate QueryOver?

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

Pero esto no funciona, porque nhibernate no puede entender el ToLower, entonces, ¿cómo se puede extender el dialecto de una manera que esto sea posible?

Respuesta

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

debe conseguir que SQL como where lower(Name) = @p0

+0

Hola, gracias por la respuesta, realmente funcionó, no sabes cuánto tiempo y tanto busqué esta solución. Gracias –

+0

@Ruben Monteiro no hay problema, me parece que a veces es necesario mezclar algunos criterios cuando se trabaja con QueryOver. – dotjoe

0

creo que funciona al menos en la acumulación estoy usando (versión 3.0.0.4000) ... a continuación es mi ejemplo ...

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

darle una oportunidad y quiero saber si funciona para usted ...

+0

esto se traduce en una cláusula where que utiliza la función en SQL Server SUPERIOR() ... (que podría ser perjudicial para el rendimiento ... FYI) – Todd

+0

Intenté esta var query = Session.GetISession(). QueryOver (); var item = (desde f en la consulta donde f.Description.ToLower() == description.ToLower() seleccione f) .List(). FirstOrDefault (); y obtuve este error Llamada al método no reconocido en epression f.Description.ToUpper(), mi versión de nHibernate si el 3.1.0.4000, @Todd - Conozco el problema de rendimiento pero necesito implementarlo de esta manera –

+0

Interesante ... su derecha no funciona cuando usas la sintaxis de QueryOver ... mi suposición es que algún día se arreglará ... Dependiendo de tus necesidades podrías pasar a usar la sintaxis de Query para esto y debería funcionar ... tu código sería actualizado de la siguiente manera ... – Todd

Cuestiones relacionadas