データ アクセスに NHibernate を使用していますが、ファサード レイヤーを介してアクセスしています。このレイヤーは、リポジトリのインターフェイスと、ISession オブジェクトに対応する IUnitOfWork インターフェイスで構成されます。
取得されたエンティティが正しく管理されるように、リポジトリにはコンストラクタで IUnitOfWork が渡され、ロードには IUnitOfWork が使用されます。
IUnitOfWork には All というプロパティが含まれており、クラスのすべてのエンティティを IQueryable として取得します (後でフィルタリングするため)。したがって、今年作成されたすべてのエンティティを取得するリポジトリ メソッドは、次のようになります。
注意: これは、これらのインターフェイスとクラスの完全なコードではありません! 私の質問に関連するコードのみ。
IUnitOfWork インターフェイス:
IQueryable<T> GetList<T>();
UnitOfWork 具象クラス:
public IQueryable<T> GetList<T>()
{
return _session.Linq<T>();
}
IFooRepository インターフェイス
IQueryable<Foo> All { get; }
IEnumerable<Foo> ThisYearsFoos{ get; }
FooRepository 具象クラス
public IQueryable<Foo> All
{
get { return _unitOfWork.GetList<Foo>(); }
}
public IEnumerable<Foo> ThisYearsFoos
{
get { return All.Where(x => x.DateCreated > new DateTime(2010,1,1);}
}
関連するエンティティを熱心にロードできるように、フェッチ戦略を指定する機能を追加したいと考えています。Foo に別のエンティティ Bar に対応するプロパティがあるとします。
public class Foo
{
public Bar {get;set;}
}
マッピング ファイルでは Bar が遅延読み込みされるように指定されていますが、ThisYearsFoos リポジトリ プロパティで、N+1 選択を回避するために Bar を積極的に読み込むように指定したいと思います。
Linq to NHibernate では、Expand() 拡張メソッドを使用して熱心なフェッチを指定できます。ただし、この拡張メソッドは NHibernateQueryable 型に属していますが、IUnitOfWork インターフェイスの GetList メソッドは IQueryable についてしか認識していません。
明らかに、IUnitOfWork インターフェイスが INHibernateQueryable について認識したくないのは、それが NHibernate について認識していないことが想定されているためです。
上記で指定したデザインを使用して、これを行う方法はありますか? それとも、私のデザインを再考する必要がありますか?
ありがとう
デビッド