Preciso saber qual é a diferença entre JoinQueryOver e JoinAlias, e quando usar cada um?
Respostas:
Funcionalmente, eles fazem a mesma coisa, criam uma junção com outra entidade. A única diferença é o que eles retornam. JoinQueryOver retorna um novo QueryOver com a entidade atual sendo a entidade unida, enquanto JoinAlias retorna o QueryOver original que possui a entidade atual como a entidade raiz original.
O que quer que você use é uma questão de gosto pessoal: (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");
e
Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
session.QueryOver<Cat>(() => catAlias)
.JoinAlias(() => catAlias.Kittens, () => kittenAlias)
.Where(() => kittenAlias.Name == "Tiddles");
São funcionalmente iguais. Observe como o kittenAlias é expressamente referenciado na segunda consulta.
QueryOver Series - Parte 2: Noções básicas e participação, de Andrew Whitaker, oferece uma explicação muito boa:
Resumo:
IQueryOver
é um tipo genérico com dois parâmetros de tipoTRoot
eTSubType
.Select
operaTRoot
enquanto outros métodos QueryOver operamTSubType
.TRoot
permanece o mesmo que você está construindo uma consulta, masTSubType
muda quando você une usandoJoinQueryOver
JoinQueryOver
eJoinAlias
adicionar junções à sua consulta.JoinAlias
não mudaTSubType
, mas mudaJoinQueryOver
.- Você pode usar aliases ao construir uma consulta para se referir a propriedades que não pertencem a
TRoot
ouTSubType
Kitten kittenAlias = null;
eCat catAlias = null;
anteriores. Acho que é bagunçado, então não uso aJoinAlias
menos que seja necessário.