2011-08-16 6 views
1

하위 수준 개체에 필터를 배치하려는 개체 그래프를 검색하는 방법을 이해하려고합니다. 따라서 아래 수업을 고려하십시오. 나는 A의 전체 콜렉션을 B의 전체 콜렉션과 함께 검색하는 질의를 원하지만, C 콜렉션의 경우, "time"프라퍼티를 기반으로 특정 날짜 범위의 요소 만 검색하고 싶다. FluentNHibernate; QueryOver를 사용하여 하위 수준 개체에 필터를 적용하는 방법

나는이 자료 이해하려고 노력 해요 : http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx#Associations

는 어쩌면 그것은 명백해야한다, 그러나 나는이 3 레벨 제한을위한 확장 기능을 사용하는 방법을보고 힘든 시간을 가지고있다. 그럼 정말 도움을 좀 주겠다.

Class A 
    public List<B> Bs; 

Class B 
    public List<C> Cs; 

Class C 
    public DateTime time; 

내 시도는 지금까지 :하지만 그것은 예외입니다; 타입 오브젝트 전송할

IQueryOver<A, B> q = session.QueryOver<A>() 
    .JoinQueryOver<B>(a => a.Bs).JoinQueryOver<C>(b => b.Cs) 
    .Where(e => e.time.Date == System.DateTime.UtcNow.Date); 

없습니다 'NHibernate.Criterion.QueryOver 2[A,C]' to type 'NHibernate.IQueryOver 2 [A, B].

+0

"var"는이 문제를 해결합니다. 예외 메시지에서 나는 단지 IQueryOver 을 IQueryOver 으로 변경한다고 말하고 싶습니다. 두 번째 제네릭은 항상 마지막으로 JoinQueryOver가 될 것입니다. 대안은 별칭의 조인 (내 기본 설정)을 사용하는 것입니다. – Sam

답변

0

당신이 어떤 점에서 목록으로 결과를 캐스팅한다고 가정하면, 내가 사용합니다 :

session.QueryOver<A>() 
.JoinQueryOver<B>(a => a.Bs) 
.Fetch(a => a.Bs).Eager 
.JoinQueryOver<C>(b => b.Cs) 
.Where(e => e.time.Date == System.DateTime.UtcNow.Date).List<A> 

키 비트가 JoinQueryOver이라고 만 WHERE 절을 구축. eager loading을 통한 콜렉션을 포함하려면 Fetch를 사용해야합니다.

관련 문제