我正在尝试使用流畅的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
答案 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; }
}