2011-03-24 13 views

Respuesta

101

Funcionalmente hacen lo mismo, crean una unión a otra entidad. La única diferencia es lo que devuelven. JoinQueryOver devuelve un nuevo QueryOver con la entidad actual siendo la entidad unida, mientras que JoinAlias ​​devuelve el QueryOver original que tiene la entidad actual como la entidad raíz original.

Cualquiera que se utiliza es una cuestión de gusto personal: (de http://nhibernate.info/doc/nh/en/index.html#queryqueryover)

IQueryOver<Cat,Kitten> catQuery = 
    session.QueryOver<Cat>() 
     .JoinQueryOver<Kitten>(c => c.Kittens) 
      .Where(k => k.Name == "Tiddles"); 

y

Cat catAlias = null; 
Kitten kittenAlias = null; 
IQueryOver<Cat,Cat> catQuery = 
    session.QueryOver<Cat>(() => catAlias) 
     .JoinAlias(() => catAlias.Kittens,() => kittenAlias) 
     .Where(() => kittenAlias.Name == "Tiddles"); 

son funcionalmente lo mismo. Observe cómo se hace referencia expresa a kittenAlias ​​en la segunda consulta.

+6

Tenga en cuenta que en el segundo ejemplo, usted tiene que declarar los alias 'kittenAlias ​​gatito = NULL;' y 'Cat catAlias ​​= null;' anterior. Lo encuentro desordenado, así que no uso 'JoinAlias' a menos que sea necesario. – foka

+0

Gracias @foka por aclarar esto. Me perdí esto y me preguntaba por qué no funcionó. –

10

QueryOver Series - Part 2: Basics and Joining by Andrew Whitaker da una muy buena explicación:

Resumen:

  • IQueryOver es un tipo genérico con dos parámetros de tipo TRoot y TSubType
  • .Select opera en TRoot mientras que otros métodos QueryOver operan en TSubType.
  • TRoot sigue siendo el mismo que usted está construyendo una consulta, pero TSubType cambia cuando se une a usar JoinQueryOver
  • JoinQueryOver y JoinAlias complemento se une a su consulta. JoinAlias no cambia TSubType, pero JoinQueryOver hace.
  • Puede utilizar alias en la construcción de una consulta para hacer referencia a propiedades que no pertenecen a TRoot o TSubType
Cuestiones relacionadas