What is the difference between JoinQueryOver and JoinAlias?
Asked Answered
R

2

91

I need to know what is the difference between JoinQueryOver and JoinAlias, and when to use each?

Reest answered 24/3, 2011 at 8:33 Comment(0)
B
111

Functionally they do the same thing, create a join to another entity. The only difference is what they return. JoinQueryOver returns a new QueryOver with the current entity being the entity joined, while JoinAlias returns the original QueryOver that has the current entity as the original root entity.

Whichever one you use is a matter of personal taste: (from 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");

and

Cat catAlias = null;
Kitten kittenAlias = null;
IQueryOver<Cat,Cat> catQuery =
    session.QueryOver<Cat>(() => catAlias)
        .JoinAlias(() => catAlias.Kittens, () => kittenAlias)
        .Where(() => kittenAlias.Name == "Tiddles");

Are functionally the same. Note how the kittenAlias is expressly referenced in the second query.

Brunell answered 24/3, 2011 at 14:33 Comment(2)
Note that in the second example you have to declare the aliases Kitten kittenAlias = null; and Cat catAlias = null; earlier. I find it messy, so I don't use JoinAlias unless it's necessary.Roentgenogram
Thank you @Roentgenogram for clarifying this. I missed this and was wondering why it didn't work.Junkojunkyard
H
15

QueryOver Series - Part 2: Basics and Joining by Andrew Whitaker gives a very good explanation:

Summary:

  • IQueryOver is a generic type with two type parameters TRoot and TSubType
  • .Select operates on TRoot while other QueryOver methods operate on TSubType.
  • TRoot stays the same as you’re building a query, but TSubType changes when you join using JoinQueryOver
  • JoinQueryOver and JoinAlias add joins to your query. JoinAlias doesn’t change TSubType, but JoinQueryOver does.
  • You can use aliases when building a query to refer to properties that don’t belong to TRoot or TSubType
Heterophyte answered 3/9, 2014 at 10:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.