Cómo fusionar dos criterios/QueryObjects en NHibernate

Tengo un objeto de consulta objeto separado y tengo un segundo ICriterios objeto criterios.

        ICriteria criteria = session.CreateCriteria<Theme>()
            .CreateAlias("InceptionCycle", "ic", JoinType.LeftOuterJoin)
            .CreateAlias("ClosingCycle", "cc", JoinType.LeftOuterJoin)
            .Add(Restrictions.Le("ic.CycleMonth", cycleDate))
            .Add(Restrictions.Or(
                Restrictions.IsNull("cc.ID"),
                Restrictions.Ge("cc.CycleMonth", cycleDate)));

        QueryOver<Theme, Theme> detached = new GlobalTheme().GetQuery();

        // and now how to make new query : detached AND criteria

¿Es posible fusionar/unir/agregar condición AND entre estos dos objetos de criterio? Algo como esto (por supuesto, la siguiente línea de código no funciona ya que el método Agregar no acepta ICriterios tipo):

detached.DetachedCriteria.GetExecutableCriteria(session).Add(criteria).List<Theme>();

La razón por la que quiero lograr es:

  • Tema global la consulta tiene algunas condiciones que se pueden mezclar con otros criterios
  • Criterios de Criterios tiene otra condición que también me puede mezclar con otros criterios (lo refactorizaré a QueryObject en el futuro)

Como resultado, para poder manejar todas las combinaciones de n posibles criterios que tendría que crear al menos n*n QueryObjects. Si es posible Y dos o más criterios, tengo que crear solo n *objeto de consulta* tipos.

Muchas Gracias

preguntado el 04 de julio de 12 a las 10:07

1 Respuestas

No es posible "fusionar" las consultas de criterios, pero lo que puede hacer para reutilizarlas es crear un método que agregue las restricciones que desee a la consulta especificada.

Un ejemplo genérico, usando un método de extensión:

var results = session.CreateCriteria<AnEntity>()
                     .Add(aSpecificRestriction)
                     .AddGenericFilters()
                     .List();

public void AddGenericFilters(this ICriteria criteria)
{
    criteria.Add(whatever);
    return criteria;
}

Respondido 04 Jul 12, 13:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.