Как создать коллекцию Expression>? - PullRequest
2 голосов
/ 30 июня 2011

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

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 ]

4 голосов
/ 30 июня 2011

Вы можете использовать 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 );
0 голосов
/ 30 июня 2011

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

var products = productRepository.FindAll(specification,
                                         new [] { p => p.Variants, 
                                                  p => p.Reviews });

Но это будет работать, только если T одинаково в обоих!

...