Использование критериев NHibernate для суммирования по нескольким свойствам / столбцам - PullRequest
2 голосов
/ 07 января 2011

Кто-нибудь знает, как выразить следующий оператор SQL, используя критерии NHibernate?

SELECT SUM(Val1 + Val2) FROM SomeTable

Кажется простым, но AFAIK Я не могу найти способ сделать это без возврата массива значений,суммы Val1 + Val2 отдельно, а затем суммирование из массива, которого я хочу избежать.

Ответы [ 4 ]

5 голосов
/ 03 июля 2014

В комментариях к сообщению в блоге, которое @Jaguar упомянул в своем ответе NHibernate и отсутствующий OperatorProjection является альтернативным решением:

session.CreateCriteria().SetProjection(
    Projections.Property<SomeType>(val => val.Id),
    Projections.Property<SomeType>(val => val.Duration),
    Projections.SqlFunction(
        new VarArgsSQLFunction("(", "+", ")"),
        NHibernateUtil.Double,
        Projections.Property<SomeType>(val => val.Duration),
        Projections.Constant(1)
    )
).List();

Все кредиты идут на Томек .

Это может выглядеть примерно так:

Projections.Sum(
    Projections.SqlFunction(
        new VarArgsSQLFunction("(", "+", ")"),
        NHibernateUtil.Int32,
        Projections.Property<SomeTableType>(val => val.Val1),
        Projections.Property<SomeTableType>(val => val.Val2)
    )
)

Особенно VarArgsSQLFunction полезно.

5 голосов
/ 28 апреля 2011

Что ж, прочитав n-й раз вопрос с этой конкретной проблемой, я решил написать реализацию, не включающую в себя написание SQL.

Вы можете проверить реализацию на http://savale.blogspot.com/2011/04/nhibernate-and-missing.html, с которой вы можете написать:

criteria.SetProjection(
                 new ArithmeticOperatorProjection("+",
                                 NHibernateUtil.Int32,
                                 Projections.Property("Prop1"), Projections.Property("Prop2")
                                                  )
                );
1 голос
/ 07 января 2011

Полагаю, что Val1 и Val2 являются значениями свойств ваших сущностей.В этом случае вы можете написать свой собственный NHibernate.Criterion.ICriterion.В вашем случае вы просто реализуете методы ToSqlString.

0 голосов
/ 07 января 2011

или вы можете использовать HQL для достижения того же.он позволяет вам работать с вашими объектами .net, а затем запрашивать сервер соответственно.

вы можете создать свой запрос следующим образом

var hqlQuery= string.format(" select a.prop1 + a.prop2 from ClassA as a where a.Id={0}",val);

return session.CreateQuery(hqlQuery).UniqueResult<double>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...