Возможным решением было бы расширить класс спецификации, добавив:
public virtual IEnumerable<Expression<Func<T, object>>> FetchRelated
{
get
{
return Enumerable.Empty<Expression<Func<T, object>>>();
}
}
и изменить GetQuery на что-то вроде:
return specification.FetchRelated.Aggregate(
session.Query<T>().Where(specification.IsSatisfiedBy()),
(current, related) => current.Fetch(related));
Теперь все, что вам нужно сделать, это переопределить FetchRelatedпри необходимости
public override IEnumerable<Expression<Func<Movie, object>>> FetchRelated
{
get
{
return new Expression<Func<Movie, object>>[]
{
m => m.RelatedEntity1,
m => m.RelatedEntity2
};
}
}
Важное ограничение этой реализации, которое я только что написал, заключается в том, что вы можете выбирать только те объекты, которые непосредственно связаны с корневым объектом.
Улучшение будет заключаться в поддержке произвольных уровней.(с использованием ThenFetch
), что потребовало бы некоторых изменений в нашей работе с генериками (я использовал object
, чтобы можно было легко комбинировать различные типы сущностей)