我有一个sql视图,其中每一列的数据类型都是string,用于jquery插件。
其中一列包含uk格式日期dd/mm/yyyy。
该列需要保留一个字符串才能使用插件的击键筛选,但是要对其进行排序,则需要将其视为日期。
我使用nhibernate条件来创建sql查询,并希望生成以下orders子句,因为这样可以正确地排序日期
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转换函数吗?
发布于 2014-04-02 08:00:26
如果设置104不是必需的,我们可以得到一个快速的解决方案:使用强制转换而不是转换。这个SQL函数内置于NHibernate方言中:
Projections.Cast(NHibernateUtil.DateTime
,Projections.Property(propNames[orderByColumn]))如果设置104很重要,我们可以创建自己的方言,注册转换函数,然后使用它.永远
在这里,安德鲁惠特克很好地展示了如何
发布于 2014-04-02 13:11:19
根据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]))));
}https://stackoverflow.com/questions/22804798
复制相似问题