2009-11-17 2 views
3

결과 페이지를 표시하기 위해 사용하는 기준 쿼리가 있습니다. 또한 모든 항목의 총 수를 얻어야합니다. 그들은 .AddOrder()에서 떨어져 동일하기 때문에 (두 개의 쿼리 카운트에 대한 결과를 페이징에 대한 하나 하나가보다는 분명히 NHibernate 기준 쿼리에서 순서 제거

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

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

CountQuery는 ""열 "dbo.Person.ordercolumn로되어 barfs ORDER BY 절에서 무효가 집계 함수 나 GROUP BY 절 중 하나에 포함되지 않기 때문에. "

이 말이 그래서 기본적으로 나는 이런 식으로 뭔가를하고 싶어.

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

이 있습니까 이런 식으로하는 방법? 내가 구원 받았다. 두 개의 중복 쿼리 (하나는 페이징 용, 다른 하나는 카운트 용)의 "위험" 분명히 어느 쪽 쿼리에 대한 변경이라도 다른쪽에 반영되어야하며 이것은 내가 좋아하지 않을 위험입니다. 너는 무엇을 할 것이냐?

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")); 
    } 
} 

답변

6

이 정확히하는 방법있다 :

+0

와우 NHibernate 친구들은 정말로 모든 것을 생각했습니다 !! 부끄러운 줄 모르는 "return StandardQuery.ClearOrders();" 왜 그들이 그렇게 한거야? – reach4thelasers

3

나는 같은 것을 할 것입니다. 불행히도 사용하기에는 다소 지저분합니다.

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

ClearOrders()가 ICriteria 대신 void를 반환하는 이유는 알 수 없지만 작동합니다.