2013-02-06 27 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的所有信用要素的角色要素) –