2009-12-16 64 views
0

如果可能,我想在NHibernate中編寫以下SQl - 分離標準。在使用NHibernate的連接中使用子查詢

select * from parent 
INNER JOIN child on parent.id=child.parentid 
INNER JOIN 
    (select ChildID, MAX(ChildDate) MaxChildDate from child group by ChildID) max 
ON child.childid, child.ChildDate=max.MaxChildDate 

這給了我每個paret最新的孩子。

我可以在Critera中編寫子查詢,但不能執行ChildID和MaxDate的雙重鏈接。

回答

1

謝謝,連接並不像示例那麼簡單,並且有很多表正在使用 - 如果在基於SQL集的設置中完成,那麼很好,但是會有大量數據返回到過濾器它在linq中。

不幸的是速度不得不勝過設計,所以我創建了一個複雜連接的視圖,並將其用作主域對象上的字典表。感謝您的所有幫助。

乾杯

斯圖

0

我不能說我真的知道你在問什麼,NHibernate會返回你正在查詢的實際對象,在這種情況下,它會返回一個/一組父對象。這個Parent對象會有一個附加的Child對象集合。就我所知,連接到這個數據兩次並且拉取不同信息的概念在NHibernate中不起作用。

如果您需要在Parent上直接使用它,我會建議在Parent對象上創建另一個變量,通過Parent.hbm.xml文件中的「where」屬性預先過濾這些細節。如果你不希望這樣做,我會建議使用LINQ或類似的東西來爲你的集合中的每個Parent取出最新的Child對象。

「何處」屬性,你會發現在你Parent.hbm.xml文件的一個例子是:

<set name="LatestChild" table="child" generic="true" inverse="true" where="*your sub-query here*"> 
    <key column="parent_id" /> 
    <one-to-many class="YourNameSpace.Model.Child,Model"/> 
</set> 

這將只返回匹配集合的地方查詢該子對象。

你可以在這個here找到相關文件。雖然這是Hibernate的參考,而不是NHibernate,但它在大多數領域幾乎相同。

祝你好運!

0

我會在父級上創建一個排序列表屬性(按ChildDate排序),所以當你得到最後一個(使用linq擴展時),你會得到你需要的。無需創建複雜的連接。