Qual é a diferença entre JoinQueryOver e JoinAlias?


88

Preciso saber qual é a diferença entre JoinQueryOver e JoinAlias, e quando usar cada um?

Respostas:


108

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.


7
Observe que no segundo exemplo você deve declarar os apelidos Kitten kittenAlias = null;e Cat catAlias = null;anteriores. Acho que é bagunçado, então não uso a JoinAliasmenos que seja necessário.
foka

Obrigado @foka por esclarecer isso. Eu perdi isso e queria saber por que não funcionou.
Mario Tacke de

12

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 tipo TRooteTSubType
  • .Selectopera TRootenquanto outros métodos QueryOver operam TSubType.
  • TRootpermanece o mesmo que você está construindo uma consulta, mas TSubTypemuda quando você une usandoJoinQueryOver
  • JoinQueryOvere JoinAliasadicionar junções à sua consulta. JoinAliasnão muda TSubType, mas muda JoinQueryOver.
  • Você pode usar aliases ao construir uma consulta para se referir a propriedades que não pertencem a TRootouTSubType
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.