2011-04-03 81 views
1

我在QueryOver中只選擇了需要的模型時遇到了一些小問題。 這裏我的方案NHibernate QueryOver只選擇需要的模型

var qOver = _HibSession.QueryOver<ModelA>(() => Ma) 
       .JoinAlias(() => Ma.MbList,() => Mb, JoinType.LeftOuterJoin) 
        .Where(() => Mb.ID == _MbId) 
       .JoinAlias(() => Mb.McList,() => Mc,JoinType.LeftOuterJoin)      
        .Where(() => Mc.ID == _McId) 
       .JoinAlias(() => Mc.MdList,() => Md, JoinType.LeftOuterJoin) 
        .Where(() => Md.ID == _MdID)            
       .OrderByAlias(() => Ma.ID).Asc 
       .Take(iTake) 
       .Skip(iSkip) 
       .Future<ModelA>(); 

上面的代碼生成後續SQL

SELECT TOP n Ma.*,Mb.*,Mc.*,Md.* 
FROM Ma 
LEFT JOIN Mb ON (...conditions...) 
LEFT JOIN Mc ON (...conditions...) 
LEFT JOIN Md ON (...conditions...) 
WHERE Mb.ID = _MbId 
AND Mc.ID = _McId 
AND Md.ID = _MdId 
ORDER BY Ma.ID ASC 

的問題是,MC和馬里蘭州表複製我的結果。所以我會在我的SELECT語句中只有Ma和Mb。

SELECT TOP n Ma.*,Mb.* 
FROM 
. 
. 
. 

我該如何達到這個結果? 謝謝!

回答

0

看來唯一的辦法是使用pricipal QueryOver選擇主模型和過濾的子查詢

我的意思是這樣

var qOverInclude = QueryOver.Of<MyModel>(() => mModel) 
       .JoinAlias(() => mModel.MyList,() => mList, JoinType.LeftOuterJoin) 
        .Where(() => mList.ID == myID) 
        .And(() => mList.Type == myType) 
       .Select(x => x.IdMyModel); 

    var qOver = _HibSession.QueryOver<MyModel>(() => mModel) 
       .JoinAlias(() => mModel.MyDescription,() => mDescription, JoinType.LeftOuterJoin) 
       .Where(() => mDescription.IDLanguage == myLanguage) 
       .WithSubquery.WhereProperty(() => mModel.IdMyModel).In(qOverSubQuery) 
       .OrderByAlias(() => mModel.IdMyModel).Asc 
       .Future<MyModel>(); 
+0

您能否提供更多詳細信息? – longday 2011-08-10 12:07:20

+0

@longday:我已經編輯我的帖子來解釋我的意思:) – Faber 2011-08-24 07:10:36

2

嘗試使用Fetch而不是JoinAlias。這樣的事情應該做的工作:

... .QueryOver<Ma>().Fetch(ma => ma.MbList).Eager 

,做使用fetch="join"在映射。

當你強迫NHibernate的使用join,它會出現在你的表的笛卡爾積返回儘可能多的行。由於每個ModelA對象只需要一個列表項,因此必須讓NHibernate使用簡單的select語句而不是join

+0

取模式允許我只將ModelA「連接」到其他模型,但我需要將ModelA「連接」到ModelB,ModelB到ModelC和ModelC到ModelD;我怎樣才能達到這個resut,或者我怎樣才能使用具有別名的fetch模式?謝謝!! – Faber 2011-04-03 22:45:01

2

您需要通知NHibernate不要重複根實體(ModelA)。你可以用下面的語句做到這一點:

.TransformUsing(Transformers.DistinctRootEntity) 
+0

我在發佈之前試過這個聲明,但它不起作用,因爲我有一個Take聲明,並且在Take聲明後應用了TrasformUsing,所以我的行數少於nTake行 – Faber 2011-04-03 22:26:18

相關問題