【问题标题】:How to truncate a float value in NHibernate Criteria Query?如何在 NHibernate Criteria Query 中截断浮点值?
【发布时间】:2019-09-12 11:31:46
【问题描述】:

我们的数据库中存储了一个值。该值的数据类型为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 条件进行相同的查询?

【问题讨论】:

    标签: nhibernate nhibernate-criteria


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      相关资源
      最近更新 更多