Pregunta

Si tengo definida una consulta con nombre simple, realiza una función de recuento, en una columna:

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

  </query>

¿Cómo obtengo el resultado de una suma o cualquier consulta que no devuelva una de las entidades asignadas, con NHibernate usando IQuery o ICriteria?

Aquí está mi intento (no puedo probarlo en este momento), ¿funcionaría?

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


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

Solución 2

¡Lo siento!En realidad quería una suma, no un recuento, lo que explica muchas cosas.He editado la publicación en consecuencia.

Esto funciona bien:

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

El enfoque de consulta con nombre todavía muere, "Errores en consultas con nombre:{Actividad.GetAllMiles}":

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


                return query.UniqueResult<double>();
            }

Otros consejos

Como respuesta indirecta a su pregunta, así es como lo hago sin una consulta con nombre.

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

Creo que en tu ejemplo original, solo necesitas query.UniqueResult();el recuento devolverá un número entero.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top