我需要知道JoinQueryOver和JoinAlias有什么区别,以及何时使用它们?
Answers:
从功能上讲,它们执行相同的操作,创建到另一个实体的联接。唯一的区别是它们返回的是什么。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");
在功能上是相同的。请注意在第二个查询中如何明确引用kittenAlias。
QueryOver系列-第2部分:Andrew Whitaker的基本知识和联接给出了很好的解释:
摘要:
IQueryOver
是具有两个类型参数的泛型类型,TRoot
并且TSubType
.Select
操作上TRoot
,而其他QueryOver方法操作上TSubType
。TRoot
与建立查询相同,但是TSubType
当您使用进行加入时会发生变化JoinQueryOver
JoinQueryOver
并JoinAlias
添加连接到您的查询。JoinAlias
不会改变TSubType
,但是JoinQueryOver
会改变。- 您可以在构建查询时使用别名来引用不属于
TRoot
或不属于的属性TSubType
Kitten kittenAlias = null;
和Cat catAlias = null;
更早版本。我发现它很乱,所以JoinAlias
除非有必要,否则我不会使用。