2008-09-15 3 views
2

Если у меня есть простой именованный запрос определен, преформ граф функции, на одной колонке:NHibernate, Sum Query

<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

Извините! Я действительно хотел получить сумму, а не счет, что объясняет многое. 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>(); 
      } 
4

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

var session = GetSession(); 
    var criteria = session.CreateCriteria(typeof(Order)) 
      .Add(Restrictions.Eq("Product", product)) 
      .SetProjection(Projections.CountDistinct("Price")); 
    return (int) criteria.UniqueResult(); 
0

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