首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过nHibernate准则使用SQL转换函数

问通过nHibernate准则使用SQL转换函数
EN

Stack Overflow用户
提问于 2014-04-02 07:49:26
回答 2查看 3.3K关注 0票数 3

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

其中一列包含uk格式日期dd/mm/yyyy。

该列需要保留一个字符串才能使用插件的击键筛选,但是要对其进行排序,则需要将其视为日期。

我使用nhibernate条件来创建sql查询,并希望生成以下orders子句,因为这样可以正确地排序日期

代码语言:javascript
复制
order by CONVERT (datetime, DateOfBirth, 103)

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

代码语言:javascript
复制
The conversion of a varchar data type to a datetime data type 
resulted in an out-of-range value

我也尝试过以下几点:

代码语言:javascript
复制
 criteria.AddOrder(
             Order.Desc(
     Projections.SqlFunction(
                              "CONVERT",
                               NHibernateUtil.DateTime, 
                               new IProjection[]
                               {
                                 Projections.Property(propNames[orderByColumn]), 
                                 Projections.Property("104")
                               }
                             )
                         )
                   ); 

但我得到以下错误消息:

代码语言:javascript
复制
NHibernate.HibernateException: Current dialect 
       NHibernate.Dialect.MsSql2008Dialect doesn't support the function: CONVERT

在使用Nhibernate.Criterion时,可以使用SQL转换函数吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-02 08:00:26

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

代码语言:javascript
复制
Projections.Cast(NHibernateUtil.DateTime
               ,Projections.Property(propNames[orderByColumn]))

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

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

票数 3
EN

Stack Overflow用户

发布于 2014-04-02 13:11:19

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

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

代码语言:javascript
复制
public class MyDialect : MsSql2008Dialect
{
    public MyDialect()
    {
        RegisterFunction("ConvertDate", 
               new SQLFunctionTemplate(NHibernateUtil.Class, 
                                        "convert(datetime, ?1, 103)"));
    }
}

创建了一个自定义投影类,允许我将新函数称为投影:

代码语言:javascript
复制
public static class MyProjections
{
    public static IProjection ConvertDate(params IProjection[] projections)
    {
        return Projections.SqlFunction("ConvertDate", 
                            NHibernateUtil.DateTime, projections);
    }
}

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

代码语言:javascript
复制
 if (propTypes[orderByColumn] == typeof(DateTime))
 {
       criteria.AddOrder(orderIsDesc
           ? Order.Desc(MyProjections.ConvertDate(
                               Projections.Property(propNames[orderByColumn])))
           : Order.Asc(MyProjections.ConvertDate(
                               Projections.Property(propNames[orderByColumn]))));
 }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22804798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档