NHibernate, Sum Query - PullRequest
       11

NHibernate, Sum Query

2 голосов
/ 15 сентября 2008

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

  <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>();
        }
    }

Ответы [ 3 ]

4 голосов
/ 16 сентября 2008

Как косвенный ответ на ваш вопрос, вот как я делаю это без именованного запроса.

var session = GetSession();
var criteria = session.CreateCriteria(typeof(Order))
            .Add(Restrictions.Eq("Product", product))
            .SetProjection(Projections.CountDistinct("Price"));
return (int) criteria.UniqueResult();
2 голосов
/ 17 сентября 2008

Извини! Я на самом деле хотел сумму, а не счет, который многое объясняет. Iv соответственно отредактировал сообщение

Это прекрасно работает:

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>();
            }
0 голосов
/ 17 сентября 2008

Я думаю, что в вашем исходном примере вам просто нужно запросить.UniqueResult (); Счет вернет целое число.

...