。
public virtual Menu FindBy(Expression<Func<Menu, bool>> query)
{
return NHUnitOfWork.Session.Query<Menu>().Where(query)
.FetchMany(m => m.Rights)
// Required with FetchMany and First, otherwise only one right would be loaded.
.ToList()
.FirstOrDefault();
}
またはあなたのモデルはメニューごとに1つだけの権利がある場合:
public virtual Menu FindBy(Expression<Func<Menu, bool>> query)
{
return NHUnitOfWork.Session.Query<Menu>().Where(query)
.Fetch(m => m.Right)
.FirstOrDefault();
}
をしかし、あなたには、いくつかの「一般的なリポジトリ」のNHibernateのAPIをカプセル化を定義したいようです。たぶん、その後
:
public virtual TEntity FindBy<TFetched>(Expression<Func<TEntity, bool>> query,
Expression<Func<TEntity, TFetched>> fetch)
{
var query = NHUnitOfWork.Session.Query<TEntity>().Where(query);
if (fetch != null)
query = query.Fetch(fetch);
return query
.FirstOrDefault();
}
しかし、あなたは多くのフェッチを*必要な場合はどのように行うには:
public virtual TEntity FindBy<TFetched>(Expression<Func<TEntity, bool>> query,
Expression<Func<TEntity, IEnumerable<TFetched>>> fetchMany)
{
var query = NHUnitOfWork.Session.Query<TEntity>().Where(query);
if (fetchMany != null)
query = query.FetchMany(fetchMany);
return query
// Required with FetchMany and First, otherwise only one right would be loaded.
.ToList()
.FirstOrDefault();
}
またはあなたのモデルはメニューごとに1つだけの権利を持っている場合
?サブフェッチ(
ThenFetch
/
ThenFetchMany
)?それは私に呪われた道のように見える。あなたは、そのパスに続くNHibernate全体のカプセル化をコード化するかもしれません。
実際に、Expression where
引数をリポジトリに公開しても、私にはよく見えません。リポジトリは、データのクエリ方法を定義する責任を負いません。
あなたがそれをしたいのであれば、IQueryable
を直接公開してみませんか?この "リポジトリ"の外側でクエリを定義しながら、 "リポジトリ"にカプセル化しようとするよりもコードが冗長であることがはるかに少なくなります。
*:複数の場合に備えてデカルト製品にご注意くださいFetchMany
。これを避けるには、クエリを複数に分割するか(1回のDBへのラウンドトリップを希望する場合はToFuture
を使用)、またはフェッチするのではなくlazy loading with batchingを使用します。
この回答はこの質問を対象としていますか?彼は 'QueryOver'ではなく' Query'を使用しており、トランスフォーマーは必要ありません。彼はAutoMapperの 'Select'や' ProjectTo'を使って投影を簡単にすることができます。 – Rabban