2009-12-09 46 views
0

我必須顯示一些存儲在關係數據庫中的對象,並使用流利的NHibernate來獲取它們。如何在流利的NHibernate中「撤消」投影?

由於我需要分頁,我必須同時得到 - 所有對象的計數和當前頁面的對象本身。

的的ICriteria達到這兩個目的是非常相似到一個點 - 用於計數我最後加 .SetProjection(Projections.RowCount()) 和當前對象名單我加 SetFirstResult,AddOrderSetMaxResults

有沒有什麼辦法可以撤銷對結果本身的標準和重新使用標準的預測,還是我必須爲此目的重新構建標準?

hibernate forums暗示一種不起作用的方式。

回答

2

我會寫封裝查詢邏輯包括限制,分組的方法,...:

public DetachedCriteria GetCriteria() 
{ 
    return DetachedCriteria.For<Entity>() 
     .Add(Restrictions.Eq(...)) 
     .Add(...); 
} 

,然後發送請求到數據庫:

var count = GetCriteria() 
    .GetExecutableCriteria(session) 
    .SetProjection(Projections.Count(Projections.Id())) 
    .UniqueResult<int>(); 

var result = GetCriteria() 
    .GetExecutableCriteria(session) 
    .SetFirstResult(0) 
    .SetMaxResults(10) 
    .List<Entity>(); 

爲了進一步優化這個你可以看看這個優秀的博客post Ayende Rahien談到NHibernate Futures。

2
public static DetachedCriteria Clone(this DetachedCriteria criteria) 
{ 
    var dummy = criteria.ToByteArray(); 
    return dummy.FromByteArray<DetachedCriteria>(); 
} 
var criteria = GetCriteria() 
var count = criteria 
    .Clone() 
    .GetExecutableCriteria(session) 
    .SetProjection(Projections.Count(Projections.Id())) 
    .UniqueResult<int>(); 

var result = criteria 
    .GetExecutableCriteria(session) 
    .SetFirstResult(0) 
    .SetMaxResults(10) 
    .List<Entity>(); 
+1

的ICriteria現在實現IClonable,所以你可以叫一個已經實現Clone方法。 – rossisdead 2013-04-17 16:13:33