2009-12-04 50 views
5

自定義SQL函數我希望能夠調用名爲「recent_date」自定義函數作爲我的HQL的一部分。就像這樣:[Date] >= recent_date()NHibernate的方言

我創建了一個新的方言,從MsSql2000Dialect繼承和指定的方言我的配置。

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

當調用recent_date()我得到以下錯誤: System.Data.SqlClient.SqlException:「recent_date」不是可以識別的函數名

我使用它在一個地方語句HasMany映射如下。

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

我在這裏錯過了什麼?

回答

3

我認爲,Where是一個SQL語句,而不是一個HQL語句。所以它不知道這個功能。它僅適用於查詢或過濾器中的HQL。

+0

對不起,有關。我應該明確指出「SELECT .... FROM SomeTable WHERE ....」只是一個例子。我們不在代碼中使用該部分。 – 2009-12-04 11:16:10

+1

答案表明。映射中的任何地方都期望純SQL而不是任何形式的HQL。 – Rashack 2010-11-01 12:45:17

1

我以爲你已經有前綴的功能「DBO」。每當你使用它。 我定製的方言有這樣的:

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

它當時叫使用

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

謝謝。但是,對於HasMany這樣的語句來說,這會起作用嗎?根據下面的鏈接,where =「」只能包含普通的舊SQL。爲了獲得我正在完成的功能,我必須採用不同的解決方案。 http://groups.google.com/group/fluent-nhibernate/browse_thread/thread/acd551226c351f77/edec6d52c12397d7?lnk=gst – 2009-12-21 07:47:50

+0

事實上你得到一個SQL異常將表明NHibernate的是通過它通過對SQL引擎和因此它不是識別該函數的NHibernate問題。因此,我會說是的。 就where子句而言只取原始sql;如果是這種情況,那麼你不應該註冊該函數,只需在where子句中直接輸入「dbo.recent_date()」即可。 – toxaq 2009-12-21 09:47:46

+0

我不認爲這將作爲SQLite(據我所知)不支持自定義函數。我需要解決方案與MsSql和SQLite一起工作,我期待在方言級別做到這一點。有任何想法嗎? – 2009-12-29 08:02:20