完全外部加入NHibernate

时间:2014-06-03 13:05:12

标签: c# nhibernate fluent-nhibernate fluent

我正在尝试使用流畅的nhibernate进行完全外部联接,但我似乎无法找出使这种方法起作用的正确语法。

我尝试过加入别名以及投影,但似乎都没有工作。

例如,如果我有两个对象(A和B),我需要获取所有对象A和所有对象B,但它们可能并不总是具有完整关系。对象A与对象B有关系,但我可能有对象B根本与对象A无关,我可能有对象A没有任何对象B.

public class objectA{
  public virtual int? ID {get; set; }
  public virtual string someData {get; set;}
  public virtual ObjectB objB {get; set;}
}

public class objectB{
  public virtual int ID_B {get; set;}
  public virtual bool boolVale {get; get;}
  public virtual int? someInt {get; set;}
}

我对他们的映射看起来像这样:

public objectA_Map(){

  Table("objectA_Table"); 
  Id(x => x.Id).Column("ID"); 
  Map(x=> x.someData).Column("someData");
  References(x => x.objB).Column("fkToB");
}

public objectB_Map(){
    Table("objectB_Table"); 
    Id (x => x.ID_B).Column("ID"); 
    Map(x =>x.boolValue).Column("Deleted"); 
    Map(x => x.someInt).Column("Number"); 
}

同样,我需要生成的查询的每一行包含所有对象的A_ID,someData,ID_B,boolValue,即使B没有A和所有A,即使有没有B.

任何见解都会有很大帮助。

我试图生成的SQL应该是这样的:

SELECT A.ID, A.someData, B.ID AS BID, B.DELETED, B.Number
FROM objectA_Table A 
FULL OUTER JOIN objectB_Table B ON A.ID = B.ID

1 个答案:

答案 0 :(得分:3)

您可能无法选择这样的完整实体,但您可以使用QueryOver从查询中构建DTO列表:

IList<DTO> result = session.QueryOver<A>(() => aAlias)
    .Full.JoinQueryOver(p => p.B, () => bAlias)
    .SelectList(list => list
        .Select(() => aAlias.Id).WithAlias(() => resultAlias.AId)
        .Select(() => aAlias.SomeData).WithAlias(() => resultAlias.SomeData)
        .Select(() => bAlias.Id).WithAlias(() => resultAlias.BId)
        .Select(() => bAlias.Deleted).WithAlias(() => resultAlias.Deleted)
        .Select(() => bAlias.Number).WithAlias(() => resultAlias.Number))
    .TransformUsing(Transformers.AliasToBean<DTO>())
    .List<DTO>();

这将生成以下SQL:

SELECT
    this_.Id         as y0_,
    this_.SomeData   as y1_,
    bAlia1_.Id       as y2_,
    bAlia1_.Deleted  as y3_,
    bAlia1_.Number   as y4_
FROM   
    [A] this_
    full outer join [B] bAlia1_ on this_.Id = bAlia1_.aId   

DTO看起来像这样:

public class DTO
{
    public Guid AId { get; set; }

    public string SomeData { get; set; }

    public Guid BId { get; set; }

    public bool Deleted { get; set; }

    public int Number { get; set; }
}