Si necesitas hacer esa comparacción server-side (en el RDBMS) la solucción
mas rapida es denormalizar CantidadDisponible persistiendola
(access="ReadOnly").

Con ConfORM sería:
orm.PersistentProperty<PartidaDeSemilla>(ps => ps.CantidadDisponible);

2010/9/21 Nicolás Marzoni <[email protected]>

> Buen día a todos.
>
> Implementamos el patrón quantity descripto por Martin Fowler,
> http://martinfowler.com/ap2/quantity.html, y lo tenemos mapeado como
> un component.
>
> Lo que me gustaría hacer es armar una consulta que esté filtrada por
> la comparación de los dos component.
>
> Aca les dejo el mapping.
>
> <?xml version="1.0" encoding="utf-8"?>
> <hibernate-mapping
>  xmlns="urn:nhibernate-mapping-2.2"
>  namespace="Entidades"
>  assembly="Entidades">
>  <class name="PartidaDeSemilla" table="PartidasDeSemilla"
> lazy="true">
>
>    <id name="IdPartidaDeSemilla" column="IdPartidaDeSemilla"
> type="Int32" unsaved-value="0">
>      <generator class="native" />
>    </id>
>
>    ...
>
>    <component name="CantidadTotal" class="Cantidad">
>      <property name="Valor" column="CantidadTotal" not-null="true"
> type="decimal(18,4)"/>
>      <many-to-one name="Unidad" class="Unidad"
> column="IdUnidadCantidadTotal" not-null="true"/>
>    </component>
>
>    <component name="CantidadReservada" class="Cantidad">
>      <property name="Valor" column="CantidadReservada" not-
> null="true" type="decimal(18,4)"/>
>      <many-to-one name="Unidad" class="Unidad"
> column="IdUnidadCantidadReservada" not-null="true"/>
>    </component>
>
>    ...
>
>  </class>
> </hibernate-mapping>
>
> La idea es filtrar las partidas de semilla y quedarme solo con
> aquellas donde CantidadTotal > CantidadReservada. En la clase
> PartidaDeSemilla hay una property CantidadDisponible que devuelve la
> resta entre CantidadTotal y CantidadReservada.
>
> Aca está la clase
>
> namespace Entidades
> {
>    public class PartidaDeSemilla
>    {
>        private int idPartidaDeSemilla;
>        private Cantidad cantidadTotal;
>        private Cantidad cantidadReservada;
>
>
>        public virtual int IdPartidaDeSemilla
>        {
>            get { return idPartidaDeSemilla; }
>            set { idPartidaDeSemilla = value; }
>        }
>
>        ...
>
>        public virtual Cantidad CantidadTotal
>        {
>            get { return cantidadTotal; }
>            set { cantidadTotal = value; }
>        }
>
>        public virtual Cantidad CantidadReservada
>        {
>            get { return cantidadReservada; }
>            set { cantidadReservada = value; }
>        }
>
>        public virtual Cantidad CantidadDisponible
>        {
>            get { return CantidadTotal - cantidadReservada; }
>        }
>
>        ...
>    }
> }
>
> Intenté crear la consulta filtrando los resultados por
> CantidadDisponible, pero al no estar mapeada dio un error.
> Como debería mapear la property CantidadDisponible o bien como
> comparar los component (CantidadTotal y CantidadReservada)
>
> Probé filtrar la consulta, que realizo con Criteria, con la expression
> Expression.GtProperty("CantidadTotal", "CantidadReservada"), pero
> compara cada uno de los campos del component
>
> ...
> WHERE
>        this_.IdSemilla = @p0
>        and (
>            this_.CantidadTotal > this_.CantidadReservada
>            and this_.IdUnidadCantidadTotal >
> this_.IdUnidadCantidadReservada
>        );
>
> Cualquier ayuda será de gran utilidad.
> Saludos.
>
> --
> Para escribir al Grupo, hágalo a esta dirección:
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano




-- 
Fabio Maulo

-- 
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