我需要知道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");
在功能上是相同的。请注意在第二个查询中如何明确引用kittenAlias。
QueryOver Series - Part 2: Basics and Joining by Andrew Whitaker提供了一个很好的解释:
摘要:
- [
IQueryOver
是具有两个类型参数TRoot
和TSubType
]的泛型类型>- [
.Select
在TRoot
上运行,而其他QueryOver方法在TSubType
上运行。- [
TRoot
]与建立查询相同,但是当您使用TSubType
进行加入时,JoinQueryOver
会发生变化>JoinQueryOver
和JoinAlias
将联接添加到查询中。JoinAlias
不变TSubType
,但JoinQueryOver
不变。- [构建查询时,您可以使用别名来引用不属于
TRoot
或TSubType
的属性