JoinQueryOver和JoinAlias有什么区别?


88

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

Answers:


108

从功能上讲,它们执行相同的操作,创建到另一个实体的联接。唯一的区别是它们返回的是什么。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。


7
请注意,在第二个示例中,您必须声明别名Kitten kittenAlias = null;Cat catAlias = null;更早版本。我发现它很乱,所以JoinAlias除非有必要,否则我不会使用。
foka 2014年

感谢@foka对此进行了澄清。我错过了,想知道为什么它不起作用。
Mario Tacke 2014年

12

QueryOver系列-第2部分:Andrew Whitaker的基本知识和联接给出了很好的解释:

摘要:

  • IQueryOver是具有两个类型参数的泛型类型,TRoot并且TSubType
  • .Select操作上TRoot,而其他QueryOver方法操作上TSubType
  • TRoot与建立查询相同,但是TSubType当您使用进行加入时会发生变化JoinQueryOver
  • JoinQueryOverJoinAlias添加连接到您的查询。JoinAlias不会改变TSubType,但是JoinQueryOver会改变。
  • 您可以在构建查询时使用别名来引用不属于TRoot或不属于的属性TSubType
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.