通过 nHibernate 标准使用 SQL CONVERT 函数

本文关键字:SQL CONVERT 函数 nHibernate 标准 通过 | 更新日期: 2023-09-27 17:56:11

我有一个sql视图,其中每列的数据类型都是string的,用于jquery数据表插件。

其中一列包含英国格式的日期 dd/mm/yyyy。

此列需要保留为字符串才能与插件的击键过滤一起使用,但是对于排序,需要将其视为日期。

我正在使用 nhibernate 条件来创建 sql 查询,我想按子句生成以下顺序,因为这可以正确排序日期

order by CONVERT (datetime, DateOfBirth, 103)

但是,在Nhibernate.Criterion.Projections没有Convert方法。有Cast,但由于它是英国日期格式,我收到以下错误:

The conversion of a varchar data type to a datetime data type 
resulted in an out-of-range value

我已经尝试过还尝试了以下方法:

 criteria.AddOrder(
             Order.Desc(
     Projections.SqlFunction(
                              "CONVERT",
                               NHibernateUtil.DateTime, 
                               new IProjection[]
                               {
                                 Projections.Property(propNames[orderByColumn]), 
                                 Projections.Property("104")
                               }
                             )
                         )
                   ); 

但是我收到以下错误消息:

NHibernate.HibernateException: Current dialect 
       NHibernate.Dialect.MsSql2008Dialect doesn't support the function: CONVERT

使用Nhibernate.Criterion时可以使用SQL转换功能吗?

通过 nHibernate 标准使用 SQL CONVERT 函数

如果设置 104 不是必需的,我们可以得到一个快速的解决方案:使用 CAST 而不是 CONVERT。此 SQL 函数内置于 NHibernate 方言中:

Projections.Cast(NHibernateUtil.DateTime
               ,Projections.Property(propNames[orderByColumn]))

如果设置 104 很重要,我们可以创建自己的方言,注册 CONVERT 函数,然后从那时起使用它......永远

在这里,安德鲁·惠特克很好地展示了如何

  • 休眠计数非重复(基于多列)

根据Radim Köhler的回答,以下是我为解决这个问题所做的工作:

创建了一个包装类,允许我注册转换函数并避免我的问题中描述的方言异常:

public class MyDialect : MsSql2008Dialect
{
    public MyDialect()
    {
        RegisterFunction("ConvertDate", 
               new SQLFunctionTemplate(NHibernateUtil.Class, 
                                        "convert(datetime, ?1, 103)"));
    }
}

创建了一个自定义投影类,以允许我将新函数作为自己的投影调用:

public static class MyProjections
{
    public static IProjection ConvertDate(params IProjection[] projections)
    {
        return Projections.SqlFunction("ConvertDate", 
                            NHibernateUtil.DateTime, projections);
    }
}

然后我检查列中的字符串表示的数据类型,如果是日期,则调用 ConvertDate 方法

 if (propTypes[orderByColumn] == typeof(DateTime))
 {
       criteria.AddOrder(orderIsDesc
           ? Order.Desc(MyProjections.ConvertDate(
                               Projections.Property(propNames[orderByColumn])))
           : Order.Asc(MyProjections.ConvertDate(
                               Projections.Property(propNames[orderByColumn]))));
 }