2009-11-17 3 views
3

У меня есть запрос критериев, который я использую для отображения страниц результатов. Мне также нужно получить общее количество всех предметов. Вместо того, чтобы иметь два запроса, один для пейджинга результатов и один для подсчета (поскольку они идентичны отдельно от .AddOrder()Удаление заказа из запроса NHibernate Query

public ICriteria StandardQuery { 
    get { 
     return NHibernateSesssionManager.GetSession.CreateCriteria<Person>.AddOrder("OrderProperty", Order.Desc); 
    } 

public ICriteria CountQuery { 
    get{ 
     return StandardQuery.SetProjection(Projections.Count("ID")); 
    } 

Очевидно CountQuery barfs с «Колонка„dbo.Person.ordercolumn“является недействительным в предложения ORDER BY, поскольку он не содержится ни в статистической функции или предложения GROUP BY.»

Это имеет смысл, так что в основном я хочу сделать что-то вроде этого.

public ICriteria CountQuery { 
    get{ 
     return StandardQuery.RemoveOrders().SetProjection(Projections.Count("ID")); 
    } 

есть способ сделать что-то подобное? Чтобы я был спасен «риск» наличия двух повторяющихся запросов, один для подкачки и один для подсчета. Очевидно, что любое изменение в любом запросе должно отражаться на другом, и это риск, который мне не нравится. Что бы вы сделали?

ответ

6

Там в метод именно для этого. К сожалению, это немного беспорядочно использовать.

private ICriteria NewCount 
    { 
     get 
     { 
      ICriteria countQuery = (ICriteria) StandardQuery.Clone(); 
      countQuery.ClearOrders(); 
      return countQuery.SetProjection(Projections.Count("ID")); 
     } 
    } 

Не знаю, почему ClearOrders() возвращает void вместо ICriteria, но это работает!

+0

WOW ребята из NHibernate действительно подумали обо всем !! Позор я не могу сделать "return StandardQuery.ClearOrders();" Интересно, почему они так поступили? – reach4thelasers

3

Я хотел бы сделать что-то вроде этого:

private ICriteria BaseQuery { 
    get { 
     return NHibernateSesssionManager.GetSession().CreateCriteria<Person>(); 
    } 
} 

public ICriteria StandardQuery { 
    get { 
     return BaseQuery.AddOrder("OrderProperty", Order.Desc); 
    } 
} 

public ICriteria CountQuery { 
    get{ 
     return BaseQuery.SetProjection(Projections.Count("ID")); 
    } 
}