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