3

我有一个使用以下方法的存储库:

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.Variantsp => p.Reviews例如。然后在存储库中,我想遍历表达式并将它们添加到查询中。

有关我为什么这样做的一些背景信息,请参阅 Ben Foster 的博客文章Eager loading with NHibernate

4

2 回答 2

5

你可以使用参数来做到这一点:

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 );
于 2011-06-30T13:47:13.197 回答
0

您可以将呼叫更改为:

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

但这只有T在两者相同的情况下才有效!

于 2011-06-30T13:47:54.193 回答