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