nhibernate queryover

nhibernate join



¿Cuál es la diferencia entre JoinQueryOver y JoinAlias? (2)

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 use es una cuestión de gusto personal: (desde 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 iguales. Observe cómo se hace referencia expresa a kittenAlias ​​en la segunda consulta.

Necesito saber cuál es la diferencia entre JoinQueryOver y JoinAlias, y cuándo usar cada uno?

Gracias.


QueryOver Series - Parte 2: Basics and Join por 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 de QueryOver operan en TSubType .
  • TRoot mantiene igual a medida que TSubType una consulta, pero TSubType cambia cuando se une mediante JoinQueryOver
  • JoinQueryOver y JoinAlias agregan combinaciones a su consulta. JoinAlias no cambia TSubType , pero JoinQueryOverJoinQueryOver hace.
  • Puede usar alias cuando TRoot una consulta para hacer referencia a propiedades que no pertenecen a TRoot o TSubType