90

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

4

2 回答 2

111

从功能上讲,它们做同样的事情,创建与另一个实体的连接。唯一的区别是他们返回什么。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 在第二个查询中是如何被明确引用的。

于 2011-03-24T14:33:57.210 回答
14

QueryOver Series - Part 2: Basics and Joining by Andrew Whitaker给出了很好的解释:

概括:

  • IQueryOver是具有两个类型参数的泛型类型,TRoot并且TSubType
  • .SelectTRoot其他 QueryOver 方法在TSubType.
  • TRoot与您构建查询时保持相同,但TSubType在您加入时会发生变化JoinQueryOver
  • JoinQueryOver并将JoinAlias连接添加到您的查询中。JoinAlias不会改变TSubType,但JoinQueryOver会。
  • 您可以在构建查询时使用别名来引用不属于TRootTSubType
于 2014-09-03T10:30:12.747 回答