2011-05-09 5 views
1

NHibernate를 사용하여 필요한만큼 엔티티의 특정 콜렉션을 정확히 정렬하도록 어플리케이션을 구성 할 수 있어야합니다.NHibernate - 진정한 동적 정렬

구성 가능한 종류 :

  • 지정 속성으로 정렬 할 수 있습니다
  • 정렬 특성에 ASC/DESC를 지정할 수 있습니다 순서
  • 에서 분류 속성을 지정할 수 있습니다 (여러 속성을 포함 할 수 즉, 해당 SQL/C# 속성이 없습니다 - 계산 됨)

이 기능 는 관리자가 SQL의 일부를 지정하고 SQL 문을 동적으로 작성/실행하는 기존 응용 프로그램에서 상속받습니다.

나는 등 유지 보수, 성능, 확장 성, 보안에 대한 내 머리에 떨어져가는 경보 모든 종류의 진흙 바다에서 받기 시작 솔루션을 통해 생각을하려고 할 때마다 .. 예를 들어

, 내가 그림 관리자는과 같이 쉼표로 구분 된 문자열을 지정할 수 있습니다

"날짜 오름차순, 이름 오름차순, 성 DESC"

내가 문자열을 분할하고 case 문에서 속성/정렬 짝 일치하는 루프를 통해 갈 수 및 호출 .AddOrder (Order.Asc ("FirstName")). 그런데 어떻게 사용자 정의 속성을 처리합니까? 사용자가 사용자 지정 속성을 계산하기 위해 SQL을 지정하도록 허용 한 다음 사용자가 FirstName처럼 정렬 할 수 있도록 허용 할 수 있지만 다시 겉으로보기에는 더러운/kludge를 다시 사용합니다.

이 요구 사항을 처리하기위한 깨끗하고 적절한 방법이 있습니까?

답변

2

많은 생각과 운의 스트로크 후, 나는 해결책을 가지고 있을지도 모른다.

public class CustomOrder : Order 
{ 
    private string customOrderSql; 

    public CustomOrder(string customOrderSql) : base("", true) 
    { 
    this.customOrderSql = customOrderSql; 
    } 

public override NHibernate.SqlCommand.SqlString ToSqlString(
    ICriteria criteria, ICriteriaQuery criteriaQuery) 
    { 
    return new NHibernate.SqlCommand.SqlString(this.customOrderSql); 
    } 

} 
다음과 같이 내 CustomOrder를 추가 어디 내 저장소에 사용자 정의 정렬 문자열을 전달할 수 있습니다

: 여전히

.AddOrder(new CustomOrder(customSort)) 

내가 할 수없는 종류의 사용자 지정 속성에 의해하지만 어쩌면 난 도망 적용 할 경우에 얻을 수 있습니다 order by 절에있는 명령. 나는 여전히 더 좋은 제안을 위해 열려 있습니다.

+0

실제로 사용자를 SQL로 입력하는 것입니다. 하지만 (예 : 사용자 정의 속성의 경우) 구문 분석을 수행하고 CustomOrder 클래스에서 SQL을 검증 및 빌드 할 수 있습니다. 내 의견으로는, 그것은 꽤 좋은 시작이다. –