Tengo algunos problemas para entender las diferencias entre cómo funcionan las Expresiones y los Funcs. Este problema se presentó cuando alguien cambia una firma de método de:Confundido acerca de pasar los argumentos Expresión vs. Func
public static List<Thing> ThingList(Func<Thing, bool> aWhere)
Para
public static List<Thing> ThingList(Expression<Func<Thing, bool>> aWhere)
Qué me rompió el código de llamada. El código de llamada de edad (que funcionaba) era la siguiente:
...
object y = new object();
Func<Thing, bool> whereFunc = (p) => p == y;
things = ThingManager.ThingList(whereFunc);
el nuevo código (que no funciona) tiene el siguiente aspecto:
...
object x = new object();
Expression<Func<Thing, bool>> whereExpr = (p) => p == x;
things = ThingManager.ThingList(whereExpr);
Esta falla dentro ThingList (...) el la línea de la utilización de la expresión:
var query = (from t in context.Things.Where(aWhere)
...
Con el error de ejecución:
Unable to create a constant value of type 'System.Object'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.
Este ejemplo es artificial, pero supongo que tiene algo que ver con que la variable de objeto local x no se "copie" correctamente en la expresión.
¿Alguien puede explicar cómo manejar esta situación en general, y por qué funciona el Func
pero el Expression
no?
sí, que se abre paso a un marco de la entidad. Supongo que tendré que crear dos métodos, uno para Expression y otro para que Func lo use cuando sea necesario. – Erix