“LINQ to Entities no admite el tipo de nodo de expresión LINQ ‘Invoke'” – ¡perplejo!

En mi EF posterior, estoy tratando de pasar una función anónima para ser utilizada como parte de mi consulta Linq. La función pasaría en INT y devolvería un BOOL (u.RelationTypeId es un INT). A continuación hay una versión simplificada de mi función:

public IEnumerable GetBandRelationsByUser(Func relation) { using (var ctx = new OpenGroovesEntities()) { Expression<Func> predicate = (u) => relation(u.RelationTypeId); var relations = ctx.UsersBands.Where(predicate); // mapping, other stuff, back to business layer return relations.ToList(); } } 

Sin embargo, obtengo el error indicado anteriormente. Parece que estoy haciendo todo lo correcto construyendo un predicado a partir de la función. ¿Algunas ideas? Gracias.

Está intentando pasar una función .NET arbitraria en … ¿cómo podría el marco de la entidad esperar traducir eso en SQL? Puede cambiarlo para tomar una Expression> lugar, y construir la cláusula Where partir de eso, aunque no será particularmente fácil, porque tendrá que volver a escribir la expresión con una expresión de parámetro diferente ( es decir, reemplazando cualquier expresión de parámetro en el árbol de expresión original con la expresión de llamada u.RelationTypeId ).

Para ser honesto, por el simple hecho de especificar u.RelationTypeId en la expresión lambda que usas para crear el árbol de expresiones para pasar al método, es mejor que simplemente uses:

 public IEnumerable GetBandRelationsByUser( Expression> predicate) { using (var ctx = new OpenGroovesEntities()) { var relations = ctx.UsersBands.Where(predicate); // mapping, other stuff, back to business layer return relations.ToList(); } } 

Estaba obteniendo este mismo error y estoy usando Entity Framework con PredicateBuilder por Joe Albahari para construir cláusulas dynamic where . Si se encuentra en la misma condición, debe llamar al método AsExpandable :

Si consulta con Entity Framework , cambie la última línea a esta:

return objectContext.Products.AsExpandable().Where(predicate);

Este método es parte de LINQKIT DLL que puedes obtener aquí o a través de un paquete NuGet aquí .

Todo funciona bien ahora 🙂

Puede llamar a Expand () method en su predicado antes de la solicitud where

Sé que esta respuesta es muy tarde, pero me encontré con el mismo problema y me llevó hasta aquí, así que pensé en compartir mi solución.

Leí la respuesta de Leniel, y eso me dio una idea. Los tipos predeterminados tienen el método “AsEnumerable ()” que se comporta de la misma manera, aliviando el problema.