Как создать коллекцию экспрессии?


У меня есть репозиторий со следующим методом:

IEnumerable<T> FindAll<TRelated>(Specification<T> specification,
                                 Expression<Func<T, TRelated>> fetchExpression);

Мне нужно передать более одного выражения. Я думал об изменении подписи на:

IEnumerable<T> FindAll<TRelated>(Specification<T> specification, 
                                 IEnumerable<Expression<Func<T, TRelated>>> fetchExpression);
  1. возможно ли это?
  2. Как создать массив, скажем, выражений для передачи в этот метод?

В настоящее время я вызываю метод из моего сервисного уровня следующим образом:

var products = productRepository.FindAll(specification,p => p.Variants);
Но я хотел бы пройти p => p.Variants и p => p.Reviews, например. А потом в репозитории я хотел бы повторить через выражение и добавить их в запрос.

Немного информации о том, почему я это делаю, смотрите в блоге Бена Фостера нетерпеливая загрузка с NHibernate.

2 2

2 ответа:

Для этого можно использовать params:

IEnumerable<T> FindAll(Specification<T> specification,
        params Expression<Func<T, object>>[] fetchExpressions)
{
    var query = GetQuery(specification);
    foreach(var fetchExpression in fetchExpressions)
    {
        query.Fetch(fetchExpression);
    }
    return query.ToList();
}

Это можно назвать так:

var products = productRepository.FindAll(specification,
        p => p.Variants, p => p.Reviews );

Вы можете изменить свой вызов на этот:

var products = productRepository.FindAll(specification,
                                         new [] { p => p.Variants, 
                                                  p => p.Reviews });
Но это будет работать только в том случае, если T одинаково в обоих случаях!