2012-10-24 42 views
2

在EF中,如果要在查詢結果中包含導航屬性,請使用Include()。由於一些查詢需要調用其再次,我試圖創建一個圍繞這一概念的通用包裝:使用linq表達式的params數組

public IQueryable<T> FindAll<P>(params Expression<Func<T, P>>[] predicates) where P : class { 
    var entities = AllEntities(); 
    foreach (var p in predicates) entities = entities.Include(p); 
    return entities; 
} 

並調用它是這樣:

var customers = FindAll(q => q.Orders, q => q.Invoices, q => q.Contacts); 

問題:

  1. 的函數編譯,但是當我調用它時:「方法的類型參數不能從用法推斷,請嘗試明確指定類型參數。」我究竟做錯了什麼?
  2. 如果我得到它的工作,我可以在第一時間撥打Include()var customers = FindAll(q => q.Orders, q => q.Invoices);然後再在一個單獨的步驟:customers = customers.Include(p => p.Invoices);或將導致表現差,這樣我應該一次做包括?

編輯:
JonSkeet的答案是正確的,當然,仍然there is this solution這似乎做我想做的。不知道爲什麼它能正常工作。是否因爲Aggregate()功能?

+0

會使它成爲'Func '嗎? –

回答

4

從根本上說,我覺得你有一個問題 - 假設q.Ordersq.Invoicesq.Contacts返回不同類型的,你不能表達你發生。你可能想類似:

entities.Include<Parent, Order>(p => p.Order); 
entities.Include<Parent, Invoice>(p => p.Invoices); 
entities.Include<Parent, Contact>(p => p.Contacts); 

...所以你要爲P每個謂詞不同的值。但是您只需調用一個方法,即可爲P提供單一類型參數。

目前尚不清楚,這是真的給你啦多少好處?不能你只寫:

var customers = AllEntities().Include(q => q.Orders) 
          .Include(q => q.Invoices) 
          .Include(q => q.Contacts); 

我會說,更清晰它得到一輪「多類型參數「問題。

+0

是的,這是我現在正在做的,但它在一個通用的存儲庫,我想能夠指定哪些導航屬性與查詢一起拉入;當然不同的實體有不同的導航屬性。如果沒有好的辦法,我會繼續使用正常的方法。 –

+0

@BobbyB:你明白可能會指出爲什麼你目前的方法無法工作?你會希望用什麼類型的參數來用於「P」? –

+0

是的我的意思是說,我正在使用「替代方法」(在您的第二個代碼塊中)執行此操作。我*想要*做的方式不適用於您解釋的確切原因 - 「P」是多種類型,即「訂單」,「發票」和「聯繫人」。 –