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 tipoTRoot
yTSubType
.Select
opera enTRoot
mientras que otros métodos de QueryOver operan enTSubType
.TRoot
mantiene igual a medida queTSubType
una consulta, peroTSubType
cambia cuando se une medianteJoinQueryOver
JoinQueryOver
yJoinAlias
agregan combinaciones a su consulta.JoinAlias
no cambiaTSubType
, peroJoinQueryOver
síJoinQueryOver
hace.- Puede usar alias cuando
TRoot
una consulta para hacer referencia a propiedades que no pertenecen aTRoot
oTSubType