我们在数据库中存储了一个值。此值的数据类型为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条件执行相同的查询吗?
答案 0 :(得分:0)
您可以使用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>();