2016-11-20 17 views
2

我想寫一個Includes的超載,這將允許我做一些類似db.Transactions.Include(t => t.Customer, t => t.Order)而不需要做db.Transactions.Include(t => t.Customer).Include(t => t.Order)。這裏是我的嘗試:如何創建包含多個實體(作爲單獨的參數傳遞)的「Include」重載?

public static IQueryable<T> Include<T, TProperty>(this IQueryable<T> source, params Expression<Func<T, TProperty>>[] paths) { 
     foreach (var path in paths) { 
      source = QueryableExtensions.Include(source, path); 
     } 

     return source; 
    } 

但是當我嘗試使用它,我得到一個錯誤,指出「該方法的類型參數不能從使用推斷。」我正在嘗試做什麼?

回答

1

你的方法不會像你期待的那樣工作。目前,您的方法會期望每個表達式都返回相同的類型,如果您爲不同類型的類屬性傳遞選擇器,這將不起作用。

要正確處理各種類型,需要通過刪除類型參數TProperty並使用Expression<Func<T, object>>作爲參數類型來更改方法的簽名。

得到的簽名應該如下:

public static IQueryable<T> Include<T>(this IQueryable<T> source, params Expression<Func<T, object>>[] paths) 

這將允許你通過各種表情收集到的方法。

您可能會懷疑它會導致問題,因爲您將該屬性隱式轉換爲object,但這不會成爲問題。如果您檢查QueryableExtensions.Include的源代碼(並深入到DbHelpers.TryParsePath),您會看到在將表達式轉換爲string之前將轉換刪除。

相關問題