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

如何在NHibernate条件查询中截断浮点值?,nhibernate,nhibernate-criteria,Nhibernate,Nhibernate Criteria,我们的数据库中存储了一个值。此值的数据类型为浮点 我们的应用程序使用NHibernate标准来查询数据库 当查询这个值时,我们想过滤一个值,比如66.66 数据库将包含值66.667 因此,在查询时,我们希望将值截断(而不是四舍五入)到两个位置,这样,如果我们查询66.66,我们将得到截断值等于66.66的所有记录 在SQL Server中,我们可以使用以下查询截断该值: CAST(ROUND(CAST([Score] AS DECIMAL (13,5)), 2, 1) AS FLOAT) =

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

我们的应用程序使用NHibernate标准来查询数据库

当查询这个值时,我们想过滤一个值,比如66.66

数据库将包含值66.667

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

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

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

是否有任何方法可以使用NHibernate条件执行相同的查询?

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

//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>();
会话
.CreateCriteria()
.SetProjection(TruncateProjection(Projections.Property(“FloatProp”)))
.添加(
限制条件(
TruncateProjection(Projections.Property(“FloatProp”),
66.66))
.List();

您可以在投影中使用
Projections.SqlFunction
SQLFunctionTemplate
包装任何截断逻辑:

//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>();
会话
.CreateCriteria()
.SetProjection(TruncateProjection(Projections.Property(“FloatProp”)))
.添加(
限制条件(
TruncateProjection(Projections.Property(“FloatProp”),
66.66))
.List();