2011-03-10 87 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由于其中的无效表名或列而不工作,它将返回一个整数,并且实体框架将创建一个概念模式,整数作为返回值而不是表格。