Как обрезать значение с плавающей запятой в запросе критериев NHibernate? - PullRequest
1 голос
/ 23 апреля 2019

У нас есть значение, хранящееся в нашей базе данных.Это значение имеет тип данных 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 голосов
/ 23 апреля 2019

Вы можете обернуть любую усеченную логику в проекции с помощью 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>();
...