Ich habe das Spezifikationsmuster mit Linq implementiert, wie hier skizziert https://www.packtpub.com/article/nhibernate-3-using-linq-specifications-data-access-layer
Ich möchte nun die Möglichkeit des eifrigen Ladens hinzufügen und bin mir nicht sicher, wie ich das am besten anstellen soll.
Die generische Repository-Klasse aus dem verlinkten Beispiel:
public IEnumerable<T> FindAll(Specification<T> specification)
{
var query = GetQuery(specification);
return Transact(() => query.ToList());
}
public T FindOne(Specification<T> specification)
{
var query = GetQuery(specification);
return Transact(() => query.SingleOrDefault());
}
private IQueryable<T> GetQuery(
Specification<T> specification)
{
return session.Query<T>()
.Where(specification.IsSatisfiedBy());
}
Und die Umsetzung der Spezifikation:
public class MoviesDirectedBy : Specification<Movie>
{
private readonly string _director;
public MoviesDirectedBy(string director)
{
_director = director;
}
public override
Expression<Func<Movie, bool>> IsSatisfiedBy()
{
return m => m.Director == _director;
}
}
Das funktioniert gut, jetzt möchte ich die Fähigkeit hinzufügen, eifrig zu laden. Ich verstehe NHibernate eager Laden kann getan werden, indem Sie abrufen. auf die Abfrage.
Was ich suche, ist, ob die Eager-Loading-Logik innerhalb der Spezifikation zu kapseln oder in das Repository zu übergeben, und auch die Linq/Ausdrucksbaum-Syntax erforderlich, um dies zu erreichen (d.h. ein Beispiel, wie es getan werden würde).