JoinQueryOver和JoinAlias有什么区别?

时间:2011-03-24 08:33:41

标签: nhibernate queryover

我需要知道JoinQueryOver和JoinAlias之间有什么区别,以及何时使用它们?

感谢。

2 个答案:

答案 0 :(得分:103)

在功能上他们做同样的事情,创建一个到另一个实体的连接。唯一的区别是他们的回归。 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。

答案 1 :(得分:10)

QueryOver Series - Part 2: Basics and Joining by Andrew Whitaker给出了一个非常好的解释:

  

要点:

     
      
  • IQueryOver是一种通用类型,包含两个类型参数TRootTSubType
  •   
  • .SelectTRoot上运行,而其他QueryOver方法在TSubType上运行。
  •   
  • TRoot与您构建查询时保持一致,但使用TSubType
  • 加入时JoinQueryOver会发生变化   
  • JoinQueryOverJoinAlias为您的查询添加联接。 JoinAlias不会更改TSubType,但JoinQueryOver会更改。{/ li>   
  • 您可以在构建查询时使用别名来引用不属于TRootTSubType的属性
  •