私は N+1 問題を扱っており、特定のクエリでコレクションを熱心にロードしたいのですが、「コレクションの遅延初期化に失敗しました」というエラーが発生するか、クエリが遅延ロードを続けます。
スタックメンバーからの多くの提案を試しましたが、うまくいきませんでした。
私のエンティティの例:
public class Bar
{
private _IList<Foo> _fooList;
public IEnumerable<Foo> FooList {get{return _fooList;} }
}
マップの例:
HasMany(d => d.FooList)
.Access.CamelCaseField(Prefix.Underscore)
.KeyColumn("IdBar")
.Cascade.AllDeleteOrphan()
.Inverse();
エラーをスローするクエリ (コレクションを遅延初期化できませんでした):
var test = GetSession().Query<Bar>()
.Fetch(b => b.FooList);
IList<Bar> bars= GetSession().QueryOver<Bar>()
.Fetch(d => d.FooList).Eager
.List();
まだ N+1 問題があるクエリ:
IList<Bar> bars= GetSession().QueryOver<Bar>()
.Fetch(d => d.FooList).Eager
.JoinQueryOver<Foo>(d => d.FooList)
.Where(f => f.Active).List<Bar>();
Foo fooAlias = null;
IList<Bar> bars= GetSession().QueryOver<Bar>()
.Fetch(d => d.FooList).Eager
.JoinAlias(d => d.FooList, () => fooAlias)
.List();
この N+1 の問題を解決するには、FooList コレクションを積極的にロードする必要があります。