web-dev-qa-db-ja.com

JoinQueryOverとJoinAliasの違いは何ですか?

JoinQueryOverとJoinAliasの違いと、それぞれをいつ使用するかを知る必要がありますか?

ありがとう。

84
Luka

機能的には同じことを行い、別のエンティティへの結合を作成します。唯一の違いは、返されるものです。 JoinQueryOverは、現在のエンティティを結合した新しいQueryOverを返し、JoinAliasは、現在のエンティティを元のルートエンティティとして持つ元のQueryOverを返します。

どちらを使用するかは個人的な好みの問題です:( 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");

そして

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

機能的には同じです。 2番目のクエリでkittenAliasが明示的に参照されていることに注意してください。

103
Vadim

QueryOverシリーズ-パート2:Andrew Whitakerによる基本と参加 は非常に良い説明を提供します:

概要:

  • IQueryOverは、2つの型パラメーターTRootおよびTSubTypeを持つジェネリック型です
  • .SelectTRootで動作し、他のQueryOverメソッドはTSubTypeで動作します。
  • TRootはクエリを作成するときと同じですが、TSubTypeを使用して参加するとJoinQueryOverが変わります
  • JoinQueryOverおよびJoinAliasは、クエリに結合を追加します。 JoinAliasTSubTypeを変更しませんが、JoinQueryOverは変更します。
  • TRootまたはTSubTypeに属さないプロパティを参照するクエリを作成するときにエイリアスを使用できます
10
Michał Powaga