2013-02-06 4 views
1

3 개의 쿼리와 미래를 사용하여 3 개의 호출을 일괄 처리하는 완전한 객체 그래프를 추출하려고합니다.Nhibernate는 future를 사용하여 쿼리를 결합합니다.

여기 내 개체 그래프의 축소 버전입니다.

public class Talent 
{ 
    public virtual int Id { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
    public virtual string Slug { get; set; } 
    public virtual IList<Credit> Credits { get; set; } 
    public virtual IList<Show> Creations { get; set; } 
} 

재능 쿼리는 크레딧, 나는 또 다른 SQL 쿼리는이 데이터를 다시 가져 오기 위해 생성되는 볼 수없는 그러나 창조주

을 얻는 방법 일 수 있습니다. 다음은 쿼리입니다.

//Selectes the root node 
var talentQuery = session.QueryOver<Filmslave.Domain.Models.Talent>() 
        .Where(t => t.Slug == slug) 
        .Take(1) 
        .Future(); 

//Fills Talent.Creations 
var creationsQuery = session.QueryOver<Filmslave.Domain.Models.Creator>() 
        .Fetch(c => c.Shows).Eager 
        .JoinQueryOver(c => c.Talent).Where(t => t.Slug == slug) 
        .Future(); 

//Fills Talent.Credits 
var creditsQuery = session.QueryOver<Filmslave.Domain.Models.Credit>() 
        .Fetch(c => c.Role).Eager 
        .Fetch(c => c.Episode).Eager 
        .JoinQueryOver(c => c.Talent).Where(t => t.Slug == slug) 
        .Future(); 

talent = talentQuery.FirstOrDefault(); 

크레딧을 받으려면 어떻게해야합니까?

답변

6

그것은 그렇게 작동해야하지만, 나는 또한 문제가 될 역행렬을 사용하여 열정적 인 로딩 관계를 발견했습니다. 쿼리를 변환하면 작동합니다.

var creditsQuery = session.QueryOver<Filmslave.Domain.Models.Talent>() 
       .Where(t => t.Slug == slug) 
       .Fetch(t => t.Credits).Eager 
       .Fetch(t => t.Credits[0].Role).Eager 
       .Fetch(t => t.Credits[0].Episode).Eager      
       .Future(); 
+1

감사합니다. 이걸 어떻게 설명 할 수 있니? 크레딧 [0]. – Cogslave

+2

당신이 Hibernate에게 콜렉션 인 자식의 자식에 대한 페치를하도록 지시하는 구문이다. (예를 들어, t.Credits는 콜렉션이고, t.Credits [0] .Role은 Hibernate에게 all을 가져 오도록 지시하는 방법이다. t)에 속하는 모든 신용 요소의 역할 요소 –

관련 문제