2009-12-04 11 views
5

Desidero poter chiamare una funzione personalizzata denominata "recent_date" come parte del mio HQL. In questo modo: [Date] >= recent_date()Funzione SQL personalizzata per il dialetto NHibernate

Ho creato un nuovo dialetto, ereditato da MsSql2000Dialect e specificato il dialetto per la mia configurazione.

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(); 

Quando si chiama recent_date() ottengo il seguente errore: System.Data.SqlClient.SqlException: 'recent_date' non è un nome di funzione riconosciuta

lo sto usando in un comunicato dove per una mappatura HasMany come sotto.

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

Cosa mi manca qui?

risposta

3

Penso che, Where sia un'istruzione SQL, non un'istruzione HQL. Quindi non conosce la funzione. Funziona solo per HQL, in query o filtri.

+0

Siamo spiacenti, a tale proposito. Avrei dovuto chiarire che "SELECT .... FROM SomeTable WHERE ...." era solo un esempio. Non usiamo quella parte nel nostro codice. –

+1

Le risposte dicono che il .Where nel tuo mapping si aspetta che l'SQL puro non abbia alcuna forma di HQL. – Rashack

1

Ho pensato che dovevi aggiungere un prefisso alla funzione con "dbo". ogni volta che lo hai usato mio dialetto personalizzato ha questo:

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

E 'poi chiamato utilizzando

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

Grazie. Ma funzionerà per una HasMany dove-dichiarazione come sopra? Secondo il link sottostante, dove = "" può contenere solo semplici SQL vecchi. Ho dovuto cercare una soluzione diversa perché avevo bisogno di ottenere la funzione su cui stavo lavorando. http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/acd551226c351f77/edec6d52c12397d7?lnk=gst –

+0

Il fatto che stai ricevendo un'eccezione SQL indica che NHibernate sta passando al motore sql e quindi non è un problema di NHibernate nel riconoscere la funzione. In quanto tale, direi di si. In termini di clausole dove si prendono solo sql grezzi; In tal caso, non dovresti registrare la funzione e digitare semplicemente "dbo.recent_date()" nella tua clausola where. – toxaq

+0

Non penso che funzionerà come SQLite (a mia conoscenza) non supporta le funzioni personalizzate. Ho bisogno che la soluzione funzioni con MsSql e SQLite e stavo cercando di farlo a livello di dialetto. Qualche idea? –

Problemi correlati