Linq-to-Entities中找不到Include方法

28

我在MVC3应用程序中使用EF4,并且我正在寻找一种查看给定工作组内所有联系人的方法。在控制器中,我指定了:

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

但是我遇到了以下错误:

'System.Linq.IQueryable' 不包含名为 'Include' 的定义,也找不到接受类型为 'System.Linq.IQueryable' 的第一个参数的扩展方法 'Include' (是否缺少 using 指令或程序集引用?)

我认为这个方法是内置在 EF4 中的。我需要以某种方式启用它吗?

5个回答

91

我之前也遇到了这个错误,通过添加以下引用来解决了问题:

using System.Data.Entity;

真不敢相信在花了这么多时间努力弄明白之后,原来如此简单。谢谢 @BruceHill - Adrian Carr
我也不敢相信解决方案是如此简单,而且在那个时候已经有一年历史的问题竟然没有人给出这个答案。所以,Adrian,没问题。很高兴我能帮到你。 - BruceHill
2
仍然是2020年对人们有价值的答案 :) - LiQuick.net

14

是的,这个方法内置在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,在那里这样的扩展已经可用。


添加 Data.Entity 命名空间: 例如,使用 System.Data.Entity; - Hunter-Orionnoir

10

Bruce Hill的回答是完全正确的。

为了进一步扩展他的回答,Include方法是System.Data.Entity命名空间中的扩展方法。

它不影响你如何使用它们,但Include方法实际上是在名为DbExtensions的静态类中定义的。在msdn.microsoft.com上,您将在那里找到它们的文档,而不是在System.Linq.IQueryable下,这使得它们稍微难以找到。


4

我之前也遇到过这个问题,在ASP.NET Core 3.0项目中通过添加以下引用解决了它:

using Microsoft.EntityFrameworkCore; 

我相信这是针对使用EF Core的项目的正确答案,请参见https://dev59.com/LzQCtIcB2Jgan1znBPGW - John Trenwith

0
如果这个问题来自于存储过程,请确保存储过程正常工作。
实体框架将尝试预测存储过程的返回值类型,如果存储过程由于无效的表名或其中的列而无法工作,则会返回一个整数,而实体框架将创建一个概念模式,期望返回一个整数而不是一个表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接