我有一个包含以下方法的存储库:
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);
目前我正在从服务层调用方法,如下所示:
var products = productRepository.FindAll(specification,p => p.Variants);
但我想以p => p.Variants
和p => p.Reviews
为例。然后在存储库中,我想迭代表达式并将它们添加到查询中。
有关我为何会这样做的一些背景知识,请参阅Ben Eager loading with NHibernate上的Ben Foster博客文章。
答案 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
在两者中都相同时才会有效!