JoinQueryOverとJoinAliasの違い、およびそれぞれをいつ使用するかを知る必要がありますか?
回答:
機能的には同じことを行い、別のエンティティへの結合を作成します。唯一の違いは、彼らが返すものです。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が明示的に参照されていることに注意してください。
QueryOverシリーズ-パート2:基本とAndrew Whitakerによる参加が非常に良い説明をしています:
概要:
IQueryOver
2つの型パラメーターTRoot
を持つジェネリック型であり、TSubType
.Select
上で動作しTRoot
、他のQueryOver方法は上で動作しながらTSubType
。TRoot
クエリを構築しているのと同じ残りますが、TSubType
変更あなたが使用して結合JoinQueryOver
JoinQueryOver
そしてJoinAlias
addはあなたのクエリに結合します。JoinAlias
変わりませんがTSubType
、変わりJoinQueryOver
ます。- クエリを作成するときにエイリアスを使用して、属していないプロパティを参照し
TRoot
たり、TSubType
Kitten kittenAlias = null;
、Cat catAlias = null;
以前のエイリアスを宣言する必要があることに注意してください。散らかっていますので、JoinAlias
必要でない限り使用しません。