2009-12-04 13 views
5

Deseo poder llamar a una función personalizada llamada "fecha_ reciente" como parte de mi HQL. De esta manera: [Date] >= recent_date()Función SQL personalizada para el dialecto NHibernate

Creé un nuevo dialecto, heredando de MsSql2000Dialect y especificando el dialecto para mi configuración.

public class NordicMsSql2000Dialect : MsSql2000Dialect 
{ 
    public NordicMsSql2000Dialect() 
    { 
     RegisterFunction(
      "recent_date", 
      new SQLFunctionTemplate(
       NHibernateUtil.Date, 
       "dateadd(day, -15, getdate())" 
       ) 
      ); 
    } 
} 

var configuration = Fluently.Configure() 
.Database(
    MsSqlConfiguration.MsSql2000 
    .ConnectionString(c => ....) 
    .Cache(c => c.UseQueryCache().ProviderClass<HashtableCacheProvider>()) 
    .Dialect<NordicMsSql2000Dialect>() 
) 
.Mappings(m => ....) 
.BuildConfiguration(); 

Al llamar recent_date() me sale el siguiente error: System.Data.SqlClient.SqlException: 'recent_date' no es un nombre de función reconocida

lo estoy usando en un comunicado donde por una asignación de HasMany como a continuación.

HasMany(x => x.RecentValues) 
    .Access.CamelCaseField(Prefix.Underscore) 
    .Cascade.SaveUpdate() 
    .Where("Date >= recent_date()"); 

¿Qué es lo que falta aquí?

Respuesta

3

Creo que Where es una declaración SQL, no una declaración HQL. Entonces no conoce la función. Solo funciona para HQL, en consultas o filtros.

+0

Lo sentimos, por eso. Debería haber dejado en claro que "SELECT .... FROM SomeTable WHERE ..." fue solo un ejemplo. No usamos esa parte en nuestro código. –

+1

Las respuestas dicen que .Where en su mapeo espera que el SQL puro no tenga ninguna forma de HQL. – Rashack

1

Pensé que tenías que prefijar tu función con "dbo". cada vez que lo usaste Mi dialecto personalizado tiene esto:

RegisterFunction("dbo.isbounded", new SQLFunctionTemplate(NHibernateUtil.Double, "dbo.IsBounded(?1, ?2, ?3, ?4, ?5, ?6)")); 

A continuación, llama usando

Expression.Sql("dbo.IsBounded(...)") 
+0

Gracias. ¿Pero funcionará para una declaración HasMany where como arriba? De acuerdo con el enlace a continuación, donde = "" solo puede contener SQL antiguo simple. Tenía que buscar una solución diferente ya que necesitaba hacer la función en la que estaba trabajando. http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/acd551226c351f77/edec6d52c12397d7?lnk=gst –

+0

El hecho de que obtenga una excepción SQL indicaría que NHibernate lo está pasando al motor SQL y por lo tanto, no es un problema de NHibernate reconocer la función. Como tal, yo diría que sí. En términos de cláusulas where solo tomando raw sql; Si ese es el caso, entonces no debería tener que registrar la función en absoluto y simplemente escriba "dbo.recent_date()" directamente en su cláusula where. – toxaq

+0

No creo que funcione, ya que, según tengo entendido, SQLite no admite funciones personalizadas. Necesito la solución para trabajar con MsSql y SQLite y estaba buscando hacerlo a nivel dialectal. ¿Algunas ideas? –

Cuestiones relacionadas