Carlos, lo que se te ocurrio es correcto si no haces fetch NHibernate podria
ir luego y obtener los tickets con selects.

Pero el resultado final del query va a ser 6 o con n+1 selects o segun tu
estrategia actual 1 sola. A mi la estrategia me parece correcta, siempre y
cuando sea lo que estas buscando.

Por supuesto que ya se que lo sabes, pero si siempre quisieras hacer join y
no solo para esta consulta lo podes poner en el mapping. Es decir, todo
depede de si tenes consultas que usan los ticket y consultas que no.

Gustavo.
On Wed, Jun 25, 2008 at 8:31 PM, Carlos Peix <[EMAIL PROTECTED]> wrote:

>  Gracias Gustavo,
>
> Lo que quiero es obtener todos los proyectos con sus tickets pero que use
> un solo query a la base de datos (por cuestiones de optimizacion).
>
> Se me ocurrio que "from Project as p left join fetch p.Tickets order by
> p.Code" deberia hacer justo eso.
>
> Por supuesto, esta prueba que estamos haciendo es una simplificacion de una
> caso real mucho mas complejo.
>
> Gracias por tu tiempo.
>
> Carlos Peix
>
>  ------------------------------
> *De:* [email protected] [mailto:
> [EMAIL PROTECTED] *En nombre de *Gustavo Ringel
> *Enviado el:* Miércoles, 25 de Junio de 2008 03:26 p.m.
> *Para:* [email protected]
> *Asunto:* [NHibernate-Hispano] Re: Asociaciones y joins (caso 1)
>
>   Hi Carlos, el query que estas haciendo ahi es algo como select P.*, T.*
> FROM Project P LEFT JOIN Ticket T
>
> El cual trae todos los P y los T en una query y tantas filas como matches
> alla en T y para el caso del projecto sin T trae nulos en T
>
> es decir tiene que traer 6...
>
> No tengo claro que esperas que devuelva la consulta...a mi gusto tiene que
> devolver 6 exactamente como esta devolviendo.
>
> Gustavo.
>
>
> On Wed, Jun 25, 2008 at 8:10 PM, Carlos Peix <[EMAIL PROTECTED]>
> wrote:
>
>>
>> Nhibernate 1.2.1.4000, .NET 1.1
>>
>> Tengo el siguiente caso, dos clases:
>>
>> // Clase Project
>> public class Project
>> {
>>        //...
>>        private string code;
>>
>>        private IList tickets = new ArrayList();
>>        public IList Tickets
>>        {
>>                get { return ArrayList.ReadOnly(tickets); }
>>        }
>>
>>        public Ticket AddTicket( string ticketText )
>>        {
>>                Ticket ticket = new Ticket(this, ticketText);
>>                tickets.Add( ticket );
>>                return ticket;
>>        }
>> }
>>
>> // y clase ticket
>> public class Ticket
>> {
>>        public Ticket(Project project, string text)
>>        {
>>                this.project = project;
>>                this.text = text;
>>        }
>>
>>        //...
>>
>>        private Project project;
>>        public Project Project
>>        {
>>                get { return project; }
>>        }
>>
>>        //...
>> }
>>
>> Mapeados asi:
>>
>>        <class name="Project" table="Projects">
>>
>>                <id name="Id"  column="Id">
>>                        <generator class="guid"/>
>>                </id>
>>
>>                <property name="Code" />
>>                <property name="Description" />
>>                <bag name="Tickets" inverse="true"
>> cascade="all-delete-orphan" lazy="true">
>>                        <key column="IdProject" />
>>                        <one-to-many class="Ticket" />
>>                </bag>
>>
>>        </class>
>> Y
>>        <class name="Ticket" table="Tickets">
>>
>>                <id name="Id"  column="Id">
>>                        <generator class="guid"/>
>>                </id>
>>
>>                <property name="Text" />
>>                <many-to-one name="Project" column="IdProject"
>> class="Project" />
>>
>>        </class>
>>
>> Luego creo tres proyectos en la base de datos:
>>
>>        Project project1 = new Project("1", "Project 1");
>>        project1.AddTicket( "Ticket 1" );
>>        project1.AddTicket( "Ticket 2" );
>>
>>        Project project2 = new Project("2", "Project 2");
>>        project2.AddTicket( "Ticket 1" );
>>        project2.AddTicket( "Ticket 2" );
>>        project2.AddTicket( "Ticket 3" );
>>
>>        Project project3 = new Project("3", "Project 3");
>>
>> Ahora veamos el problema:
>>
>>        IQuery query = s.CreateQuery( "from Project as p left join fetch
>> p.Tickets order by p.Code" );
>>        IList list = query.List();
>>        Assert.AreEqual( 3, list.Count );
>>
>> Este test falla, list.Count es igual a 6!, que es igual a la cantidad
>> filas
>> que devuelve el join. Dentro del IList tengo dos entradas a la misma
>> instancia del projecto 1, tres a la del proyecto 2 y 1 del proyecto 3.
>> Quiero usar el join fetch para que me cargue todos proyectos y tickets en
>> un
>> solo query.
>>
>> Por que? Hicimos algo mal?
>>
>> Si alguno esta interesado, tengo un proyecto con tests que demuestran esto
>> y
>> generan automaticamente la BD.
>>
>> Carlos Peix
>>
>>
>>
> >
>

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