2011-03-10 124 views
22

我在MVC3應用程序中使用EF4,並且正在尋找一種方法來查看給定工作組中的所有聯繫人。在控制器I規定:Linq-to-Entities包含方法未找到

var wg = from w in _repo.Workgroups.Include("Contact").ToList(); 

,但我得到了以下錯誤:

'System.Linq.IQueryable' does not contain a definition for 'Include' and no extension method 'Include' accepting a first argument of type 'System.Linq.IQueryable' could be found (are you missing a using directive or an assembly reference?)

我雖然這種方法被內置到EF4。我能以某種方式啓用它嗎?

回答

16

是的方法是內置到EF中,但它不可用在接口上IQueryable。它可在ObjectQuery上找到。如果你想在IQueryable上打電話,你必須創建你自己的擴展,將當前查詢轉換爲ObjectQuery並執行Include。喜歡的東西:

public static IQueryable<T> Include<T>(this IQueryable<T> query, string property) 
{ 
    var objectQuery = query as ObjectQuery<T>; 
    if (objectQuery == null) 
    { 
    throw new NotSupportedException("Include can be called only on ObjectQuery"); 
    } 

    return objectQuery.Include(property); 
} 

,或者您必須使用Entity Framework Feature CTP5,其中這樣的擴展已經上市。

80

我還通過添加以下引用得到這個錯誤並解決它:

using System.Data.Entity; 
+0

在花費這麼多時間試圖弄清楚之後,難以置信的那麼簡單。謝謝@BruceHill – 2014-01-22 11:06:53

+0

我也不敢相信這個解決方案有多容易,而且當時還沒有人對這個問題提出過一年多的答案。所以,阿德里安,沒問題。很高興我能幫上忙。 – BruceHill 2014-02-06 10:44:40

+4

這適用於Entity Framework 5及更高版本。 – 2014-04-21 16:19:50

10

布魯斯·希爾的回答是絕對正確的。

爲了擴展他的答案,Include方法是System.Data.Entity命名空間中的擴展方法。

它不影響你如何使用它們,但是Include方法實際上是在名爲DbExtensions的靜態類中定義的。在msdn.microsoft.com上,你會看到他們記錄在那裏,而不是在System.Linq.IQueryable下,使他們更難找到。

0

如果此問題來自存儲過程,請確保SP工作正常。

實體框架將嘗試預測來自存儲過程的返回值的類型,並且如果SP由於其中的無效表名或列而不工作,它將返回一個整數,並且實體框架將創建一個概念模式,整數作爲返回值而不是表格。