2011-03-10 16 views
22

Estoy usando EF4 dentro de una aplicación MVC3 y estaba buscando una manera de ver todos mis contactos dentro de un grupo de trabajo determinado. En el controlador que se especifica:Linq-to-Entities Incluir método no encontrado

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

pero me sale el siguiente error:

'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?)

que aunque este método se construyó en EF4. ¿Lo tengo habilitado de alguna manera?

Respuesta

16

Sí, el método está integrado en EF pero no está disponible en la interfaz IQueryable. Está disponible en ObjectQuery. Si desea llamarlo al IQueryable, debe crear su propia extensión que convertirá la consulta actual en ObjectQuery y ejecutar Include. Algo así como:

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); 
} 

O se debe utilizar Entity Framework Feature CTP5 donde tales extensiones ya están disponibles.

80

También conseguía este error y lo resolvió mediante la adición de la siguiente referencia: La respuesta de

using System.Data.Entity; 
+0

No puedo creer que haya sido tan fácil después de pasar tanto tiempo tratando de resolverlo. Gracias @BruceHill –

+0

Tampoco podía creer lo fácil que era la solución, y que nadie había dado esta respuesta a una pregunta que tenía más de un año en ese momento. Entonces, no hay problema, Adrian. Me alegro de poder ayudar. – BruceHill

+4

Esto funciona para Entity Framework 5 y superior. –

10

Bruce Hill es absolutamente correcto.

Solo para ampliar un poco su respuesta, los métodos de inclusión son métodos de extensión en el espacio de nombres System.Data.Entity.

No afecta la forma en que los usa, pero los métodos Include se definen realmente en una clase estática llamada DbExtensions. En msdn.microsoft.com, los verá documentados allí, no en System.Linq.IQueryable, lo que los hace un poco más difíciles de encontrar.

0

Si este problema proviene de un procedimiento almacenado, asegúrese de que el SP funcione correctamente.

Entity Framework intentará predecir el tipo de valor de retorno del Procedimiento almacenado, y si SP no funciona debido a un nombre de tabla o columna no válidos, devuelve un Entero y Entity Framework crea un Esquema conceptual que espera un entero como valor de retorno en lugar de una tabla.