Gracias por compartir la solución genio!

----------------------------------
Carlos Peix

2016-09-15 15:52 GMT-03:00 César Pistiner <chpisti...@gmail.com>:

> Hola gente!
>
> Bueno he logrado solucionar el problema en forma más óptima y les dejo la
> forma en que lo hice por si otro se topa con lo mismo.
>
> Anteriormente lo que hacía era agrupar por Id de la cabecera luego de
> obtener la lista, pero esta claro que esto a nivel performance no es lo
> ideal, así que encontré la forma de hacer un *DISTINCT* desde *Criteria
> Queries*
>
> Si recuerdan yo creaba el *criteria* de esta forma:
> *nhCriteria = nhCriteria.CreateCriteria("Detalles",
> NHibernate.SqlCommand.JoinType.InnerJoin); *
>
> Pero para que funcione como les mencioné hay que hacer lo siguiente:
>
>
>
>
> *var detallesCriteria =
> DetachedCriteria.For<DetalleMovimientoDeRetornables>().SetProjection(Projections.Distinct(Projections.Property("MovimientoDeRetornables.Id")));detallesCriteria.Add(Restrictions.Eq("Producto",
> productoAFiltrar));*
>
> *nhCriteria.Add(Subqueries.PropertyIn("Id", detallesCriteria));*
>
> Con esto quedó funcionando a la perfección.
>
> Saludos!
> César
>
> El mié., 14 sept. 2016 a las 17:52, César Pistiner (<chpisti...@gmail.com>)
> escribió:
>
>> No es eso Juan José, muchas gracias de todas formas.
>>
>> Sigo con el problema. Yo pensé que era algo del mapping porque si
>> condiciono solamente por atributos de la cabecera anda perfecto, el tema
>> está cuando creo el Criteria del detalle.
>>
>> Saludos y gracias!
>>
>> El mié., 14 sept. 2016 a las 17:14, Juan José Montes de Oca Arbós (<
>> juanjose.montesdeocaar...@gmail.com>) escribió:
>>
>>> Hola Cesar, no estoy 100% seguro, pero se me ocurre que si no tenés
>>> implementados los métodos de Equals y GetHashCode (o los tenés mal
>>> implementados) NHibernate podría devolverte dos objetos que para vos son
>>> iguales, pero para NH son diferentes. Se que esto ocurre cuando manejas los
>>> objetos en memoria, pero no se si ocurre en el caso de consultarlos a la
>>> base de datos.
>>>
>>> Saludos Y ÉXITOS!!
>>>
>>> --
>>> Juan José Montes de Oca Arbós.
>>>
>>> ===========================
>>> Web personal: http://juanjose.montesdeocaarbos.com.ar/blog/
>>>
>>> El 14 de septiembre de 2016, 17:05, César Pistiner <chpisti...@gmail.com
>>> > escribió:
>>>
>>>> Hola gente,
>>>>
>>>> Estoy teniendo un problema y no le encuentro la vuelta. Usando
>>>> NHibernate con Criteria Queries tengo una entidad que es cabecera-detalle y
>>>> cuando obtengo una lista en la cual debo condicionar el detalle me trae un
>>>> objeto (cabecera) por cada detalle que tenga. El ejemplo sería así, basado
>>>> en movimientos de stock:
>>>>
>>>> Tengo 2 movimientos:
>>>> - MOVIMIENTO 1
>>>> - MOVIMIENTO 2
>>>>
>>>> Detalle de MOVIMIENTO 1:
>>>> - PRODUCTO A - ENTRADA x 10 - POSICION 001
>>>> - PRODUCTO A - ENTRADA x 20 - POSICION 002
>>>>
>>>> Detalle de MOVIMIENTO 1:
>>>> - PRODUCTO B - ENTRADA x 10 - POSICION 001
>>>> - PRODUCTO B - ENTRADA x 20 - POSICION 002
>>>>
>>>> Si obtengo una lista condicionando los movimientos con PRODUCTO A,
>>>> estoy recibiendo una lista que contiene 2 cabeceras, con 2 detalles cada
>>>> una. Si inspeccionó dicha lista veo que es el mismo movimiento (MOVIMIENTO
>>>> 1) duplicado.
>>>>
>>>> Ese es el problema, el cual estoy resolviendo con agrupación luego de
>>>> obtener la lista.
>>>>
>>>> El mapping contra los detalles lo tengo así:
>>>>
>>>> CABECERA
>>>> <bag name="Detalles" table="DetalleMovimiento" inverse="true"
>>>> cascade="all,delete-orphan" lazy="true">
>>>>   <key column="IdMovimiento"/>
>>>>   <one-to-many class="DetalleMovimiento"/>
>>>> </bag>
>>>>
>>>> DETALLE
>>>> <many-to-one name="Movimiento" column="IdMovimiento" class="Movimiento"
>>>> foreign-key="FK_DetalleMovimiento_Movimiento"/>
>>>>
>>>> Luego a través de Criteria Queries lo que hago es:
>>>>
>>>> nhCriteria = nhCriteria.CreateCriteria("Detalles",
>>>> NHibernate.SqlCommand.JoinType.InnerJoin);
>>>>
>>>> nhCriteria.Add(Restrictions.Eq("Producto", productoAFiltrar));
>>>>
>>>> Eso es todo (creo), agradezco cualquier sugerencia o ayuda, tal vez es
>>>> un error común, las soluciones que encontré navegando no me dieron
>>>> resultado.
>>>>
>>>> Espero haber sido claro y desde ya agradezco el tiempo robado!
>>>>
>>>> Aprovecho para saludarlos y agradecer todos los aportes que hacen.
>>>> César
>>>>
>>> --
>>>> --
>>>> Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano@
>>>> googlegroups.com
>>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>>> ---
>>>> Has recibido este mensaje porque estás suscrito al grupo
>>>> "NHibernate-Hispano" de Grupos de Google.
>>>> Para anular la suscripción a este grupo y dejar de recibir sus
>>>> mensajes, envía un correo electrónico a nhibernate-hispano+
>>>> unsubscr...@googlegroups.com.
>>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>>>
>>>
>>> --
>>> --
>>> Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano@
>>> googlegroups.com
>>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>>> ---
>>> Has recibido este mensaje porque estás suscrito al grupo
>>> "NHibernate-Hispano" de Grupos de Google.
>>> Para anular la suscripción a este grupo y dejar de recibir sus mensajes,
>>> envía un correo electrónico a nhibernate-hispano+
>>> unsubscr...@googlegroups.com.
>>> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>>>
>> --
> --
> Para escribir al Grupo, hágalo a esta dirección: NHibernate-Hispano@
> googlegroups.com
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
> ---
> Has recibido este mensaje porque estás suscrito al grupo
> "NHibernate-Hispano" de Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus mensajes,
> envía un correo electrónico a nhibernate-hispano+
> unsubscr...@googlegroups.com.
> Para acceder a más opciones, visita https://groups.google.com/d/optout.
>

-- 
-- 
Para escribir al Grupo, hágalo a esta dirección: 
NHibernate-Hispano@googlegroups.com
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
--- 
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" 
de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía 
un correo electrónico a nhibernate-hispano+unsubscr...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.

Responder a