我已经使用 Linq 实现了规范模式,如此处所述https://www.packtpub.com/article/nhibernate-3-using-linq-specifications-data-access-layer
我现在想添加急切加载的能力,但不确定最好的方法。
链接示例中的通用存储库类:
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());
}
以及规范实现:
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;
}
}
这工作得很好,我现在想添加能够急切加载的能力。我了解 NHibernate 急切加载可以通过在查询上使用Fetch来完成。
我正在寻找的是是否将预先加载的逻辑封装在规范中或将其传递到存储库中,以及实现这一点所需的 Linq/表达式树语法(即如何完成的示例)。