2014-01-06 44 views
1

我使用PredicateBuilder將動態表達式傳遞給我的存儲庫中的一個方法,該方法在Where子句中使用它。下面是相關庫代碼:PredicateBuilder和n + 1查詢

 var results = context.Set<T>().AsExpandable.Where(where); 


     foreach (var includeProperty in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
     { 
      results = results.Include(includeProperty); 
     } 
     return results.ToList(); 

在我的控制器我有這樣的:

var predicate = PredicateBuilder.True<Account>(); 
if (amount> 0) 
    predicate = predicate.And(d => d.Amount <= amount); 


var model = AccountRepository.Get(predicate, "Owner").ToList(); 
return PartialView(model); 

當我做出的「所有者」的屬性參考它使另一個往返到數據庫中,引起n + 1查詢問題。有沒有什麼解決方法可以避免這種情況?

+1

看來,所有者屬性是延遲加載。你能用Accound代碼更新你的問題嗎? – giacomelli

回答

3

執行包括前AsExpandable像這樣:

var results = context.Set<T>() 

foreach (var includeProperty in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
{ 
    results = results.Include(includeProperty); 
} 

return results.AsExpandable.Where(where).ToList(); 
+0

Thx很多,唯一需要改變它的上下文。Set ()返回DbQuery ,至於我不能調用.Include,我最終放置var結果= context.Set ().Where(where) ;然後返回results.AsExpandable()。ToList(); –