私はこのようなIQueryable<T>
を公開し、一般的なリポジトリを使用しています:Linq2NHibernateの.Fetchと.ThenFetchは、抽象リポジトリ内でどのようにラップするのですか?
public IQueryable<T> AllEntities
{
get
{
return session.Query<T>();
}
}
私はこのようなクエリを実行することができますT
が親や祖父母の実体があり、場合
var results =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e).ToList();
しかし、私がしたいです私はこれを行う必要があり、熱心にそれらをロード:
var results =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e)
.Fetch(x => x.Parent)
.ThenFetch(x => x.Grandparent)
.ToList();
これは動作しますが、.Fetch
と私は、ファイルの先頭にusing NHibernate.Linq;
文を含める必要が
:は二つの問題を引き起こしているLinq2Nhibernate特定の拡張メソッド、両方です。しかし、このクエリを実行している時点では、それは実装に依存しないでください。
これをユニットテストしようとすると、私のモックリポジトリが提供する
IQueryable<T>
に対して実行すると、.Fetch
と.ThenFetch
メソッドが失敗します。
IRepository<T>
インターフェイスの内部またはいくつかの一般的な拡張メソッドの内部でこれらをラップするにはどうすればよいですか?
更新:
これまでのところ私が思い付くしたすべては私のリポジトリインターフェイスにこれを追加することです:
IQueryable<T> EagerLoadParent<U>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression);
IQueryable<T> EagerLoadParent<U, V>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression,
Expression<Func<U, V>> grandparentExpression);
...と、この私のNHibernateはリポジトリの実装に:
public IQueryable<T> EagerLoadParent<U>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression)
{
return query
.Fetch(parentExpression);
}
public IQueryable<T> EagerLoadParent<U, V>(IQueryable<T> query,
Expression<Func<T, U>> parentExpression,
Expression<Func<U, V>> grandparentExpression)
{
return query
.Fetch(parentExpression)
.ThenFetch(grandparentExpression);
}
このAPIのコンシューマは次のようになりました:
var query =
(from e in repository.AllEntities
where e.SomeProperty == "some value"
select e);
var results = repository
.EagerLoadParent(query, e => e.Parent, p => p.Grandparent)
.ToList();
しかし、これは私が好む素晴らしい拡張メソッドの構文が欠けています。私は.Fetch
と.ThenFetch
の構文に近いものを探しています。
(私は自分自身よりもはるかに多くの熟練した同僚にこの、クレジットを書いていない)が、今私がオブジェクトにLINQで動作IFetchRequestを実装する必要がありますか? – Sly
最後に私はこれに対する解決策を見つけました。ありがとう! – Chris
@Chris - あなたが見つけた解決策を教えてください。 – Sam