Pergunta

Se eu tiver uma simples consulta com o nome definido, o preformas de uma função de contagem, em uma coluna:

  <query name="Activity.GetAllMiles">
    <![CDATA[
      select sum(Distance) from Activity
    ]]>

  </query>

Como faço para obter o resultado de uma soma ou de qualquer consulta não retornar de uma das entidades mapeadas, com NHibernate usando IQuery ou ICriteria?

Aqui está a minha tentativa (im não é possível testá-lo agora), será que isso funciona?

    public decimal Find(String namedQuery)
    {
        using (ISession session = NHibernateHelper.OpenSession())
        {
            IQuery query = session.GetNamedQuery(namedQuery);


            return query.UniqueResult<decimal>();
        }
    }
Foi útil?

Solução 2

Desculpe!Na verdade, eu queria uma soma, não uma contagem, o que explica muito.Iv editou o post assim

Isso funciona bem:

var criteria = session.CreateCriteria(typeof(Activity))
                          .SetProjection(Projections.Sum("Distance"));
   return (double)criteria.UniqueResult();

A consulta com o nome abordagem ainda morre, "Erros no chamado consultas:{Atividade.GetAllMiles}":

 using (ISession session = NHibernateHelper.OpenSession())
            {
                IQuery query = session.GetNamedQuery("Activity.GetAllMiles");


                return query.UniqueResult<double>();
            }

Outras dicas

Como uma indireta resposta para a sua pergunta, aqui está como fazê-lo sem uma consulta de nome.

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

Eu acho que no seu exemplo original, você só precisa consultar.UniqueResult();a contagem irá retornar um inteiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top