如何创建Expression <func <t,trelated =“”>&gt;?</func <t,>的集合

时间:2011-06-30 13:43:44

标签: linq linq-to-nhibernate linq-expressions specification-pattern

我有一个包含以下方法的存储库:

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. 如何创建一个数组,比如传递给这个方法的表达式?
  3. 目前我正在从服务层调用方法,如下所示:

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

    但我想以p => p.Variantsp => p.Reviews为例。然后在存储库中,我想迭代表达式并将它们添加到查询中。

    有关我为何会这样做的一些背景知识,请参阅Ben Eager loading with NHibernate上的Ben Foster博客文章。

2 个答案:

答案 0 :(得分:4)

您可以使用参数来执行此操作:

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 );

答案 1 :(得分:0)

您可以将通话更改为:

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

但只有T在两者中都相同时才会有效!