2011-04-14 5 views
1

나는 검색 결과의 페이지 된 목록을 가지고있다. 사용자는 'derp'를 검색 할 수 있으며 이름의 해당 문자 시퀀스가있는 모든 항목이 반환됩니다.어떻게 결과 검색어의 위치에 따라, NHibernate에 검색 결과의 순위를 지정하려면?

나는 결과의이 세트는 처음 관련성에 따라 순위가 될 수 있도록이를 변경하도록 요청했습니다. 일반적으로 목록이

a derp abc // everything is alphabetical 
a derp xyz 
b derp abc 
derp abc 
derp def 
herp derp a 
herp derp b 

로 반환 될 경우 이제 목록이 목록 페이징되어야 함을 염두에

derp abc // these guys are given prominence 
derp def 
a derp abc // the rest of results alphabetical as normal 
a derp xyz 
b derp abc 
herp derp a 
herp derp b 

유지로 정렬 할 필요가있다 (예를 난 그냥 참을 수 없어 검색 결과 수동으로 중간에서 'DERP'의 발생을 제거하고 전면으로 이동), I는 필수 순위를 지정할 수 있습니다 NHibernate에 어떤 방법이 있습니까?

또는 먼저 'DERP'이 포함되어 있지만,로 시작하지 않는 'DERP'와 두 번째로 시작 무엇을 찾고, 내가이 쿼리 어떻게해야합니까?

답변

4

이 잘 작동 할 수 있도록있는 OrderBy는 계획을 사용할 수 있습니다

var list = session.QueryOver<Store>() 
    .Where(s => s.Name.IsLike("My", MatchMode.Anywhere)) 
    .OrderBy(NHibernate.Criterion.Projections.Conditional(
     NHibernate.Criterion.Restrictions.Like(
      NHibernate.Criterion.Projections.Property<Store>(s => s.Name), "My", 
       MatchMode.Start), 
      NHibernate.Criterion.Projections.Constant(0), 
      NHibernate.Criterion.Projections.Constant(1))).Asc 
    .ThenBy(s => s.Name).Asc 
    .List(); 

우리는 기본적으로 다음과 같은 SQL로 변환하는 프로젝션 사용하고 여기서 뭐하는 :

ORDER BY (case when this_.Name like 'My%' then 0 else 1 end) 
관련 문제