Вопрос

Если у меня определен простой именованный запрос, он создает функцию подсчета в одном столбце:

  <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();счетчик вернет целое число.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top