Nhibernate JoinQueryOver和JoinAlias之间有什么区别?

Nhibernate JoinQueryOver和JoinAlias之间有什么区别?,nhibernate,queryover,Nhibernate,Queryover,我需要知道JoinQueryOver和JoinAlias之间的区别,以及何时使用它们?从功能上讲,它们做的是相同的事情,创建到另一个实体的连接。唯一的区别是它们的回报。JoinQueryOver返回一个新的QueryOver,其中当前实体是被加入的实体,而JoinAlias返回将当前实体作为原始根实体的原始QueryOver 无论您使用哪一种,都是个人喜好的问题: (来自) IQueryOver catQuery= session.QueryOver() .JoinQueryOver(c=>c.

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

从功能上讲,它们做的是相同的事情,创建到另一个实体的连接。唯一的区别是它们的回报。JoinQueryOver返回一个新的QueryOver,其中当前实体是被加入的实体,而JoinAlias返回将当前实体作为原始根实体的原始QueryOver

无论您使用哪一种,都是个人喜好的问题: (来自)

IQueryOver catQuery=
session.QueryOver()
.JoinQueryOver(c=>c.小猫)
其中(k=>k.Name==“Tiddles”);

Cat catAlias=null;
Kitten kittenAlias=null;
IQueryOver catQuery=
session.QueryOver(()=>catAlias)
.JoinAlias(()=>catAlias.Kittens,()=>kittenAlias)
.Where(()=>kittenAlias.Name==“Tiddles”);
在功能上是相同的。注意在第二个查询中Kittenalia是如何被明确引用的。

给出了一个很好的解释:

总结:

  • IQueryOver
    是一种通用类型,具有两个类型参数
    TRoot
    TSubType
  • .Select
    TRoot
    上操作,而其他查询方法在
    TSubType
    上操作
  • TRoot
    在生成查询时保持不变,但是使用
    JoinQueryOver
  • JoinQueryOver
    JoinAlias
    将联接添加到查询中
    JoinAlias
    不会更改
    TSubType
    ,但
    JoinQueryOver
    会更改
  • 您可以在生成查询时使用别名来引用不属于
    TRoot
    TSubType

注意,在第二个示例中,您必须声明别名
Kitten kittenAlias=null
Cat catAlias=null更早。我发现它很乱,所以除非有必要,否则我不会使用
JoinAlias
。谢谢@foka澄清这一点。我错过了这个,想知道为什么它不起作用。
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");