Nhibernate使用期货加入查询

时间:2013-02-06 08:07:09

标签: .net nhibernate

我正在尝试使用3个查询和期货来提取完整​​的对象图,以批量处理3个调用。

这是我的对象图的缩减版。

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; }
}

Talent查询能够找出如何获取创作者

但是学分没有,我可以看到生成另一个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();

我如何让人才获得它的学分?

1 个答案:

答案 0 :(得分: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();