2009-12-09 3 views
0

Мне нужно отобразить некоторые объекты, которые хранятся в реляционной базе данных, и я использую беглый NHibernate для их получения.Как «отменить» проекцию в свободном NHibernate?

Поскольку мне нужен пейджинг, мне нужно получить оба - количество всех объектов и объекты для текущей страницы.

ICriteria для обеих целей очень похожи до точки - для подсчета я, наконец, добавить .SetProjection (Projections.RowCount()) и для текущего списка объектов добавить SetFirstResult, AddOrder и SetMaxResults

Можно ли отменить проекцию критериев и критериев повторного использования самих результатов или мне нужно восстановить критерии для этой цели?

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, в котором Айенде Рахиен рассказывает о 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

 Смежные вопросы

  • Нет связанных вопросов^_^