2014-09-07 2 views
2

이 linq와 일치하는 ICriteria는 어떻게 작성합니까?nHibernate ICriteria 많은 많은 속성 최소값으로

ProgramItems.OrderBy(x => x.TimeBlocks.Min(y => y.StartTime)) 

ProgramItem - TimeBlock 많은 관계에 많은있다.

이 코드와 TimeBlock의 ID로 필터링 할 수 있습니다

:

criteria.Add(Subqueries.Exists(DetachedCriteria.For<ProgramItem>("p") 
     .CreateAlias("p.TimeBlocks", "timeBlocks") 
     .Add(Restrictions.EqProperty("p.Id", "ProgramItem.Id")) 
     .Add(Restrictions.Eq("timeBlocks.Id", request.TimeBlockId)) 
     .SetProjection(Projections.GroupProperty("p.Id")) 
     .Add(Restrictions.Eq(Projections.Count("p.Id"), 1)))); 

하지만 TimeBlock의 속성에 의해 주문 별칭/프로젝션을 사용하는 방법을 찾을 수 없습니다 - 어떤 단서?

답변

2

과 같을 것이다 many-to-many 말을 통해 BY 주문 방법 방법 : 우리가 볼 수 있듯이

var subquery = DetachedCriteria.For<TimeBlock>("timeBlock") 
    .CreateAlias("timeBlock.ProgramItems", "programItems") 
    .SetProjection(Projections.Min("timeBlock.StartTime")) 
    .Add(Restrictions.EqProperty("programItems.Id", "root.Id")); 

// ORDER BY built from Subquery 
var orderByMin = new Order(Projections.SubQuery(subquery), true); // true is ASC 

var list = session 
    .CreateCriteria<ProgramItem>("root") 
    .AddOrder(orderByMin) 
    .SetMaxResults(10) // paging... if needed 
    .List<ProgramItems>(); 

, 모두 many-to-many 매핑되어야합니다 끝납니다. 그런 다음 TimeBlock 엔티티에 MIN 부분을 작성하고 있습니다 (테이블에 ProgramItem에 JOIN이 있음). 이것은 필터링하는 방법으로 루트 쿼리에서 사용됩니다.

내 제안은 many-to-many을 페어링 테이블에 대한 명시 적 엔티티로 변경하는 것입니다. 그러면 쿼리가 훨씬 단순해질 수 있지만이 경우에도이 경우에도이 작업을 수행 할 수 있습니다.

+0

감사합니다. 작동합니다! –

+0

그레이트 볼 수 :) –

관련 문제