如何在NHibernate条件查询中截断float值?

时间:2019-04-23 09:51:13

标签: nhibernate nhibernate-criteria

我们在数据库中存储了一个值。此值的数据类型为float

我们的应用程序使用NHibernate条件查询数据库。

查询此值时,我们要过滤一个值,例如66.66。

数据库将包含值66.6666667

因此,在查询时,我们希望将值截断(而不是四舍五入)到两个位置,这样,如果在66.66上查询,我们将获得截断值等于66.66的所有记录。

在SQL Server中,我们可以使用以下查询来截断该值:

CAST(ROUND(CAST([Score] AS DECIMAL (13,5)), 2, 1) AS FLOAT) = 66.66

有什么方法可以使用NHibernate条件执行相同的查询吗?

1 个答案:

答案 0 :(得分:0)

您可以使用Projections.SqlFunctionSQLFunctionTemplate在投影中包装所需的任何截断逻辑:

//Use ?1, ?2, ?3... for arguments in template
private static readonly SQLFunctionTemplate TruncateTemplate = 
    new SQLFunctionTemplate(NHibernateUtil.Double, "CAST(ROUND(CAST( ?1 AS DECIMAL (13,5)), 2, 1) AS FLOAT)");

public static IProjection TruncateProjection(IProjection value)
{
    return Projections.SqlFunction(TruncateTemplate, NHibernateUtil.Double, value);
}

标准中的用法示例:

session
    .CreateCriteria<Entity>()
    .SetProjection(TruncateProjection(Projections.Property("FloatProp")))
    .Add(
        Restrictions.Eq(
            TruncateProjection(Projections.Property("FloatProp")),
            66.66))
    .List<double>();