2

我有下面的方法儲存庫:如何創建表達式<Func <T, TRelated>>的集合?

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上的博客文章。

+0

我不知道[Ben Foster](http://www.imdb.com/name/nm0004936/)是程序員! – Shibumi

回答

4

你可以使用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); 
+1

'params'方法很好,但是當它們是'IEnumerable'時如何執行表達式?加入'Query ()'與fetchExpressions? –

+0

這隻有在TRelated對於兩者都是相同的情況下才有效。 –

+1

修復它使用對象而不是TRelated。 –

0

您可以將您的呼叫改成這樣:

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

但這隻有在T兩者都是相同的情況下才會有效!

相關問題