NHibernate, Soma Consulta
-
09-06-2019 - |
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>();
}
}
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.