2010-02-07 63 views
2

我試圖高效地與父母&孩子(&標籤)實體一起工作。可在此處看到代碼示例:http://gist.github.com/297464用NHiberate有效返回父和子記錄

如果任何Post包含多個標記,則在少於10個不同的Post實體中使用以下結果。

var posts = session 
    .CreateCriteria<Post>() 
    .SetMaxResults(10) 
    .SetFetchMode("Tags", FetchMode.Eager) 
    .List<Post>(); 

如果刪除上述.SetFetchMode線,我得到的10條記錄我正在尋找,但所有的標籤實體進行查詢,然後在內存中過濾。

看來我應該能夠指示NHiberate通過PostIds列表或進行連接。

我對NHiberate很新,所以也完全有可能我這樣做完全錯誤。

謝謝,
斯科特

+0

可能不會影響這種特殊情況下,但你必須逆的標籤集合=「真」,但對方(帖子的標籤的集合)被註釋掉了。你只需要反駁一下那個_doesn't_擁有這個集合。 –

回答

2

的問題是,SetMaxResults不施加到根實體的數量從查詢返回的,它被轉換成一個T-SQL TOP(在SqlServer的的情況下),其應用於來自聯接查詢的結果。由於結果集中有一行爲根實體的每個子項,因此TOP不會產生所需的效果。

要實現對根實體數量的限制,可以對包含SetMaxResults限制的子查詢使用連接查詢。

// Select the ids of the first ten posts 
var subquery = DetachedCriteria.For<Post>() 
    .SetMaxResults(10) 
    .SetProjection(Projections.Property("Id")); 

// Do a join query with posts and tags, for the posts who's ids are 
// in the result of the subquery 
var posts = session.CreateCriteria<Post>() 
    .SetFetchMode("Tags", FetchMode.Join) 
    .Add(Subqueries.PropertyIn("Id", subquery)) 
    .SetResultTransformer(Transformers.DistinctRootEntity) 
    .List<Post>(); 
+0

感謝您的提示。這更接近我想要完成的事情。不幸的是,它爲每個標籤返回一個原始數據,但最終的結果現在與我希望完成的內容保持一致。最後,我想我只是讓標籤被延遲加載(和緩存),但很高興知道這是一個選項。謝謝! –

+0

代碼中的「標籤」是一個魔術字符串。有沒有辦法避免使用魔法字符串,並能夠利用重構工具中的「重命名」? –

+0

查看http://code.google.com/p/nhlambdaextensions/ –

相關問題