如何在NHibernate Criteria Query中截断浮点值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在NHibernate Criteria Query中截断浮点值?相关的知识,希望对你有一定的参考价值。

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

我们的应用程序使用NHibernate Criteria来查询数据库。

查询此值时,我们希望过滤一个值,例如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标准进行相同的查询?

答案

您可以使用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);
}

以及Criteria中的使用示例:

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

以上是关于如何在NHibernate Criteria Query中截断浮点值?的主要内容,如果未能解决你的问题,请参考以下文章

Nhibernate Query By Criteria 条件查询

Nhibernate系列学习之 Criteria查询表达式增删改查

nHibernate标准ResultTransformer不工作

与 NHibernate 和标准联合?

NHibernate - 外连接,不懒惰,忽略未找到 - 你如何在一个语句中构建对象?

NHibernate和整数一样