通过nHibernate Criterion使用SQL CONVERT函数

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

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

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

我使用nhibernate标准来创建sql查询,我想生成以下order by子句,因为这正确地命令日期

 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转换函数吗?

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

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

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

Andrew Whitaker在这里很好地展示了如何做到

  • Nhibernate计数不同(基于多列)

基于RadimKöhler的回答,这是我为解决问题所做的工作:

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

 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])))); }