2009-12-04 22 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