NHibernate, запрос суммы
-
09-06-2019 - |
Вопрос
Если у меня определен простой именованный запрос, он создает функцию подсчета в одном столбце:
<query name="Activity.GetAllMiles">
<![CDATA[
select sum(Distance) from Activity
]]>
</query>
Как мне получить результат суммы или любого запроса, который не возвращает ни один сопоставленный объект, с помощью NHibernate, используя либо IQuery, либо ICriteria?
Вот моя попытка (сейчас я не могу ее проверить), сработает ли это?
public decimal Find(String namedQuery)
{
using (ISession session = NHibernateHelper.OpenSession())
{
IQuery query = session.GetNamedQuery(namedQuery);
return query.UniqueResult<decimal>();
}
}
Решение 2
Извини!На самом деле мне нужна была сумма, а не подсчет, и это многое объясняет.Я соответствующим образом отредактировал сообщение
Это отлично работает:
var criteria = session.CreateCriteria(typeof(Activity))
.SetProjection(Projections.Sum("Distance"));
return (double)criteria.UniqueResult();
Подход с именованными запросами все еще умирает: «Ошибки в именованных запросах:{Activity.GetAllMiles}":
using (ISession session = NHibernateHelper.OpenSession())
{
IQuery query = session.GetNamedQuery("Activity.GetAllMiles");
return query.UniqueResult<double>();
}
Другие советы
В качестве косвенного ответа на ваш вопрос, вот как я это делаю без именованного запроса.
var session = GetSession();
var criteria = session.CreateCriteria(typeof(Order))
.Add(Restrictions.Eq("Product", product))
.SetProjection(Projections.CountDistinct("Price"));
return (int) criteria.UniqueResult();
Я думаю, что в вашем исходном примере вам просто нужно запросить.UniqueResult();счетчик вернет целое число.