Nhibernate QueryOver JoinAlias UnRelated Entity

时间:2014-11-12 10:39:01

标签: nhibernate fluent-nhibernate

我在NHibernate中遇到一个关于使用“JoinAlias”的左连接的问题,当我要查找的结果查询SQL是这样的时候:

"select * from EntityA T1 left join EntityB T2 on T2.EntityAId=T1.id"

在NHibernate中我有这个但是不起作用:

 var query = _session.QueryOver(() => EntityA)
                      .Left.JoinAlias(() => EntityA, () => EntityB.EntityA)

在NHibernate中EntityA不引用EntityB而引用EntityB作为对EntityA的引用。

public class EntityA
{ 
   public int Id {get;set;}
}

public class EntityB
{ 
   public int Id {get;set;}
   public EntityA EntityA {get;set;}
}

如何在HHibernate Work中进行非常简单的左连接?

1 个答案:

答案 0 :(得分:0)

CriteriaQueryOver无法做到这一点。但我们可以使用 HQL ,它支持

  

可能会出现多个类,从而产生笛卡尔积或“交叉”连接。

from Formula, Parameter
from Formula as form, Parameter as param

所以在上面的例子中我们会有这样的HQL:

FROM EntityA T1 
   , EntityB T2 
WHEERE T2.EntityAId = T1.id

几乎是same issue

但是在上述情况下,已经映射了反向关系。这意味着,我们可以扩展C#实体定义:

public class EntityA
{ 
   public int Id {get;set;}
   // one-to-many
   // the bidirectional mapping of the below relation
   public IList<EntityB> EntityBColl { get; set; }
}

public class EntityB
{ 
   public int Id {get;set;}
   // many-to-one
   // this is the inversed end in fact of the bidirectional mapping
   public EntityA EntityA {get;set;}
}

有了这些,我们可以使用标准QueryOver API:

// aliases
EntityA EntityA = null;
EntityB EntityB = null;

// query
var query = session.QueryOver(() => EntityA)
    .Left.JoinAlias(() => EntityA.EntityBColl , () => EntityB)
    ...
    ;