2011-08-23 45 views
0

:)NHibernate的集合的大小,而無需加載整個集合

我有以下類別:

    • DislikedComment (評論)
    • 成員Id (INT)
  • 評論
    • 不喜歡(名單<踩>)
    • 文本(字符串)
    • 條款ArticleID (INT)

(超爲簡潔起見,省略了屬性)

這些類以預期的方式使用Fluent NHibernate進行映射(在註釋列表上反向)。現在我想讓NHibernate在加載評論時加載不喜歡集合的大小,但不加載整個集合。我非常想避免使用公式(yuk @ native sql),我寧願讓NHibernate只激發一個查詢。這是可能的嗎?

我知道Extra Lazy功能,但據我所知,這會激發額外的查詢,這對於數百個評論列表來說並不是最佳的。

+0

只是爲了確認你要求計算孩子(不喜歡)而不必加載整個圖表? – Rippo

+0

@Rippo,是的,我只需要Dislike count。 – ManiSto

+0

在這種情況下,lazy =「extra」對你來說是完美的搭配。 – Rippo

回答

1

這是一個常見的錯誤,你需要1個查詢最佳性能。

每次連接都要求數據庫執行額外的工作,並且查詢的複雜性和成本隨着每次額外連接而快速增長。雖然關係數據庫針對處理連接進行了優化,但執行多個單獨的查詢而不是單個查詢(其中包含多個連接)往往更有效。

在你的情況下,我會做2個查詢。

var dislikeCount = _session.Query<Comment>().Count(x=>x.Dislike); 
var comments = _session.Query<Comment>().ToList(); 

ps:別忘了把它包裝在一個事務中。

+0

是的。但是,一如既往,在決定哪個更快之前進行配置。 _Premature_優化通常是不值得的。 –

+0

除非您在映射中添加lazy ='extra',否則您將執行select *而不是'select count(*)' – Rippo