Using SQL CONVERT function through nHibernate Criterion

前端 未结 2 1257
我在风中等你
我在风中等你 2020-12-11 23:55

I have a sql view, in which the data type of every column is string, for use with the jquery datatables plugin.

One of the columns contains a uk format

相关标签:
2条回答
  • 2020-12-12 00:32

    If the setting 104 is not essential, we can get a quick solution: use CAST instead of CONVERT. This SQL Function is built-in in the NHibernate dialects:

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

    If the setting 104 is important we can create our own Dialect, register the CONVERT function, and use it from then ... forever

    Here Andrew Whitaker nicely shows how to

    • Nhibernate count distinct (based on multiple columns)
    0 讨论(0)
  • 2020-12-12 00:32

    Based on Radim Köhler's answer, here is what I did to fix the problem:

    Created a wrapper class to allow me to register the convert function and avoid the dialect exception described in my question:

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

    Created a custom projection class to allow me call the new function as a projection in its own right:

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

    Then I check the data type that the string in column represents, then call the ConvertDate method if it is a date

     if (propTypes[orderByColumn] == typeof(DateTime))
     {
           criteria.AddOrder(orderIsDesc
               ? Order.Desc(MyProjections.ConvertDate(
                                   Projections.Property(propNames[orderByColumn])))
               : Order.Asc(MyProjections.ConvertDate(
                                   Projections.Property(propNames[orderByColumn]))));
     }
    
    0 讨论(0)
提交回复
热议问题