Estoy creando una consulta en el CpBT formato. Esta consulta es un
resultado de la suma de otros tres. Para obtener un rendimiento, la
necesidad de enviar 3 consultas dentro de una transacción y
ejecutarlos sólo al final, que es cuando voy a necesitar. Traté de
usar Futuro <>, pero las consultas se realizan cuando se activan y no
para cuando lo necesite para agruparlos. Sería interesante realizar
sólo al final, para evitar el envío al banco y tienen un retorno de
los tres individualmente. Se utiliza como un ejemplo
http://ayende.com/blog/3979/nhibernate-futures

El siguiente código de ejemplo que estoy usando:
Servicio de capa:

      [PersistenceConversation(ConversationEndMode =
EndMode.Continue)]
        public IEnumerable<ConeSlab>
QueryPlacasParaAcompanhamento(String codigoLaminador, Int16
placasAEnfornar, Boolean placasEnfornadas, Int16 placasDesenfornadas,
Boolean placasRejeitadas)
        {
            try
            {
                /*
                 * As consultas serão realizadas de forma futura.
Serão acumulados todos os comandos de sql, e no fim quando os dados
forem solicitados na concatenação, o banco retornará os mesmos.
                 * Feito desta forma para ficar otimizado e evitar
consultas desnecessárias no banco
                 */
                IEnumerable<ConeSlab> listaAEnfornar = new
List<ConeSlab>();
                IEnumerable<ConeSlab> listaEnfornadas = new
List<ConeSlab>();
                IEnumerable<ConeSlab> listaDesenfornadas = new
List<ConeSlab>();
                ArrayList arrayList = new ArrayList();

                //A Enfornar
                if (placasAEnfornar > 0)
                {
                    var criteriaAEnfornar =
DetachedCriteria.For<ConeSlab>()
                        .CreateAlias("Cone", "C")
                        .CreateAlias("Slab.SlabPDO", "SP");

                    ICriterion criterion = Restrictions.Conjunction()
                        .Add(Restrictions.Eq("C.Mill",
codigoLaminador))
                        .Add(Restrictions.IsNotNull("C.IdentBegin"))
                        .Add(Restrictions.IsNotNull("SP.IdentEndDtm"))
                        .Add(Restrictions.IsNull("SP.ChargeDtm"));

                    Junction disjunction = Restrictions.Disjunction();
                    disjunction.Add(criterion);

                    if (placasRejeitadas)
                        criterion = Restrictions.Conjunction()
                            .Add(Restrictions.Eq("C.Mill",
codigoLaminador))
                            .Add(Restrictions.IsNotNull("C.IdentBegin"))
                            .Add(Restrictions.IsNotNull("SP.IdentEndDtm"))
                            .Add(Restrictions.IsNull("SP.ChargeDtm"))
                            .Add(Restrictions.IsNotNull("SP.RejectDtm"));
                    else
                        criterion = Restrictions.Conjunction()
                            .Add(Restrictions.Eq("C.Mill",
codigoLaminador))
                            .Add(Restrictions.IsNotNull("C.IdentBegin"))
                            .Add(Restrictions.IsNotNull("SP.IdentEndDtm"))
                            .Add(Restrictions.IsNull("SP.ChargeDtm"))
                            .Add(Restrictions.IsNull("SP.RejectDtm"));

                    disjunction.Add(criterion);
                    criteriaAEnfornar.Add(disjunction);

                    listaAEnfornar =
coneSlabRepository.GetListFuture(criteriaAEnfornar, placasAEnfornar,
Order.Desc("SP.IdentSeq"));
                }

                //Enfornadas
                if (placasEnfornadas)
                {
                    var criteriaEnfornadas =
DetachedCriteria.For<ConeSlab>()
                        .CreateAlias("Cone", "C")
                        .CreateAlias("Slab.SlabPDO", "SP")
                        .Add(Restrictions.Eq("C.Mill",
codigoLaminador))
                        .Add(Restrictions.IsNotNull("C.IdentBegin"))
                        .Add(Restrictions.IsNotNull("SP.ChargeDtm"))
                        .Add(Restrictions.IsNull("SP.DischDtm"));

                    listaEnfornadas =
coneSlabRepository.GetListFuture(criteriaEnfornadas,
Order.Desc("SP.ChargeDtm"));
                }

                //Desenfornadas
                if (placasDesenfornadas > 0)
                {
                    var criteriaDesenfornadas =
DetachedCriteria.For<ConeSlab>()
                        .CreateAlias("Cone", "C")
                        .CreateAlias("Slab.SlabPDO", "SP");
                    ICriterion criterion = Restrictions.Conjunction()
                        .Add(Restrictions.Eq("C.Mill",
codigoLaminador))
                        .Add(Restrictions.IsNotNull("C.IdentBegin"))
                        .Add(Restrictions.IsNotNull("SP.DischDtm"))
                        .Add(Restrictions.IsNull("SP.MillDtm"));

                    Junction disjunction = Restrictions.Disjunction();
                    disjunction.Add(criterion);

                    if (placasRejeitadas)
                        criterion = Restrictions.Conjunction()
                            .Add(Restrictions.Eq("C.Mill",
codigoLaminador))
                            .Add(Restrictions.IsNotNull("C.IdentBegin"))
                            .Add(Restrictions.IsNotNull("SP.DischDtm"))
                            .Add(Restrictions.IsNull("SP.MillDtm"))
                            .Add(Restrictions.IsNotNull("SP.RejectDtm"));
                    else
                        criterion = Restrictions.Conjunction()
                            .Add(Restrictions.Eq("C.Mill",
codigoLaminador))
                            .Add(Restrictions.IsNotNull("C.IdentBegin"))
                            .Add(Restrictions.IsNotNull("SP.DischDtm"))
                            .Add(Restrictions.IsNull("SP.MillDtm"))
                            .Add(Restrictions.IsNull("SP.RejectDtm"));

                    disjunction.Add(criterion);
                    criteriaDesenfornadas.Add(disjunction);
                    listaDesenfornadas =
coneSlabRepository.GetListFuture(criteriaDesenfornadas,
placasDesenfornadas, Order.Desc("SP.DischDtm"));
                }

                return from p in
(IEnumerable<ConeSlab>)listaAEnfornar.Concat<ConeSlab>(listaEnfornadas).Concat<ConeSlab>(listaDesenfornadas)
                       select p;
            }
            catch (Exception ex)
            {
 
Log.Error(AppStrings.EventNatureProgramacaoSequenciamento,
LibStrings.MessageExceptionQuery, ex);
                throw new LoggedException(ex.Message);
            }
        }


 Repositorio:

        public IEnumerable<T> GetListFuture(DetachedCriteria criteria,
Int32 topRegister = 0, params Order[] orders)
        {
            return RepositoryHelper<T>.GetExecutableCriteria(Session,
criteria, orders).SetMaxResults(topRegister).Future<T>().ToList<T>();
        }


Saludos cordiales

-- 
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano

Responder a