JoinQueryOver和JoinAlias有什么区别?

Luk*_*uka 86 nhibernate queryover

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

谢谢.

Vad*_*dim 106

在功能上他们做同样的事情,创建一个到另一个实体的连接.唯一的区别是他们的回归.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");
Run Code Online (Sandbox Code Playgroud)

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

在功能上是相同的.请注意在第二个查询中如何明确引用kittenAlias.

  • 请注意,在第二个示例中,您必须声明别名`Kitten kittenAlias = null;`和`Cat catAlias = null;`.我发现它很乱,所以我不使用`JoinAlias`,除非它是必要的. (7认同)

Mic*_*aga 11

QueryOver系列 - 第2部分:Andrew Whitaker的基础和加入给出了一个非常好的解释:

摘要:

  • IQueryOver是一个通用的类型具有两个类型参数TRootTSubType
  • .SelectTRoot其他QueryOver方法运行时运行TSubType.
  • TRoot在构建查询TSubType时保持不变,但在使用时更改JoinQueryOver
  • JoinQueryOverJoinAlias为您的查询添加联接.JoinAlias不会改变TSubType,但JoinQueryOver确实如此.
  • 您可以在构建查询时使用别名来引用不属于TRoot或的属性TSubType