1

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 クエリは、Creator を取得する方法を解決できます。

ただし、クレジットはそうではありません。このデータを再度取得するために別の 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();

タレントにクレジットをもらうにはどうすればよいですか?

4

1 に答える 1

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();
于 2013-02-06T12:09:29.647 に答える