2011-11-22 20 views
6

Dando una relación de Equipo -> Atleta y preguntando a todos los atletas. ¿Qué estoy malentendiendo sobre fetch="Join"? ¿Debería este mapeo causar que el Equipo se cargue a través de una unión? Al iterar a los atletas, todavía carga el Equipo.NHibernate Join Fetch (Tipo)

public class AthleteMap : ClassMapping<Athlete> 
{ 
     public AthleteMap() 
     { 
      ManyToOne(a => a.Team, o => 
             { 
              o.Fetch(FetchKind.Join); 
              o.Lazy(LazyRelation.NoLazy); 
             } 
       );  
     }  
} 

que produce este HBM:

<class name="Athlete" table="Athletes"> 
    <id name="Id" type="Int32" /> 
    <property name="FirstName" /> 
    <property name="LastName" /> 
    <many-to-one name="Team" fetch="join" lazy="false" /> 
    <property name="Created" /> 
</class> 

iteración:

var session = factory.OpenSession(); 

foreach (var athlete in session.Query<Athlete>()) 
    Console.WriteLine("{0} {1}", athlete.FirstName, athlete.Team.Name); 
+0

¿Se obtiene una excepción? ¿Cuales? – Gerard

+0

Entonces, cuando repites, ¿ves las consultas obteniendo un 'Equipo' por' atleta'? Quiero decir, el mapeo es correcto, aparte de la búsqueda ansiosa. –

+0

Sin excepción. @GertArnold sí mientras itera, consulta al equipo en cada iteración. – mxmissile

Respuesta

13

El NHibernate LINQ consulta No usa la estrategia de recuperación de la asignación. Debes recuperar Fetch() en tu consulta de linq así.

var session = factory.OpenSession(); 

foreach (var athlete in session.Query<Athlete>().Fetch(x => x.Team)) 
    Console.WriteLine("{0} {1}", athlete.FirstName, athlete.Team.Name); 

La estrategia ha podido recuperar la define en el documento de mapeo afecta:

  • recuperación a través Get() o Load()
  • recuperación que ocurre implícitamente cuando se navega una asociación
  • ICriteria consultas
  • HQL consulta si se utiliza la subselección de búsqueda

source: performance-fetching

+1

Gracias ... es una pena que su implementación de Linq sea incompleta como esta. – klkitchens