Necesito saber cuál es la diferencia entre JoinQueryOver y JoinAlias, y cuándo usar cada uno.
Respuestas:
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: (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 iguales. Observe cómo se hace referencia expresa a kittenAlias en la segunda consulta.
QueryOver Series - Part 2: Basics and Unirse por Andrew Whitaker da una muy buena explicación:
Resumen:
IQueryOver
es un tipo genérico con dos parámetros de tipoTRoot
yTSubType
.Select
operaTRoot
mientras otros métodos QueryOver operanTSubType
.TRoot
permanece igual a medida que crea una consulta, peroTSubType
cambia cuando se une usandoJoinQueryOver
JoinQueryOver
yJoinAlias
agregue uniones a su consulta.JoinAlias
no cambiaTSubType
, pero loJoinQueryOver
hace.- Puede utilizar alias al crear una consulta para hacer referencia a propiedades que no pertenecen
TRoot
aoTSubType
Kitten kittenAlias = null;
yCat catAlias = null;
antes. Lo encuentro complicado, así que no lo uso aJoinAlias
menos que sea necesario.