2013-02-06 26 views
1

我正在嘗試使用3個查詢和期貨來提取完整​​的對象圖,以批量處理3個調用。Nhibernate使用期貨加入查詢

這是我的對象圖的減少版本。

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

謝謝,這固定它。你能解釋一下這個t.Credits [0]。角色是如何工作的嗎? – Cogslave

+2

它的語法允許你告訴NHibernate對一個集合的子集的孩子進行讀取(例如,其中t.Credits是一個集合,t.Credits [0] .Role是一種告訴NHibernate獲取所有集合的方法屬於t的所有信用要素的角色要素) –